Dolphins의 HelloWorld

Programmers > 코딩테스트 연습 > 완전탐색 > 숫자야구 본문

Algorithm/Programmers 문제풀이

Programmers > 코딩테스트 연습 > 완전탐색 > 숫자야구

돌핀's 2018. 11. 25. 22:05

문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42841




풀이



완전탐색을 이용해 이 문제를 풀 수 있다는 것을 알아낸다면 그렇게 어려운 문제는 아니나 


이를 깨닫지 못해 꽤 오랫동안 풀었던 문제이다.




가능한 답이 되는지 검사해볼 수는 모든 세자리 수 이므로 대충 900개라고 하고 질문은 최대


100개까지 할 수 있으므로 최대한 검사해도 90000번 검사를 수행하며 고로


완전탐색이 가능하다.



만약 문제가 잘 안풀린다면 반복문을 수행할 때 0이 나오는 경우를 배제하지 않았을 경우가


있으므로 이에 유의하도록 하자.


#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> baseball) {
	int answer = 0;
	for (int i = 123; i <= 987; i++)
	{
		int x = i % 10;
		int y = (i / 10) % 10;
		int z = (i / 100);

		if (x == 0 || y == 0 || z == 0) continue;
		if ((x == y) || (y == z) || (x == z)) continue;

		for (int j = 0; j < baseball.size(); j++)
		{
			int strike = 0;
			int ball = 0;

			int question = baseball[j][0];
			int question_x = question % 10;
			int question_y = (question / 10) % 10;
			int question_z = (question / 100);

			if (question_x == 0 || question_y == 0 || question_z == 0) break;
			if (x == question_x) strike++;
			if (y == question_y) strike++;
			if (z == question_z) strike++;
			if (strike != baseball[j][1]) break;

			if ((x == question_y) || (x == question_z)) ball++;
			if ((y == question_x) || (y == question_z)) ball++;
			if ((z == question_x) || (z == question_y)) ball++;
			if (ball != baseball[j][2]) break;

			if (j == baseball.size() - 1) answer++;
		}
	}
	return answer;
}
int main()
{
	vector<vector<int>> baseball{ {123,1,1},{356,1,0},{327,2,0},{489,0,1} };
	printf("%d\n", solution(baseball));
}
Comments