본문 바로가기

ALGORITHM_PRACTICE

[프로그래머스] 숫자 야구

숫자 야구

 

코딩테스트 연습 - 숫자 야구 | 프로그래머스

[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

programmers.co.kr

중, 고등학교 때 수업시간, 자습시간에 했던, 군복무할 때 할게 없어서 하던 그 숫자 야구게임. 완전 탐색 문제이기 때문에 모든 3자리 숫자에 대해서 스트라이크, 볼 검증을 하면 된다. 정답이 123이면 baseball 벡터의 숫자와 비교하면서 스트라이크 개수, 볼의 개수가 모두 같으면 정답이 가능한 숫자로 answer를 카운트하면 된다.

다만 문제에 조건들을 자세히 읽어보지 않으면 아마 채점 결과가 계속 50 ~ 60일 것이다. 문제에서 숫자는 3자리 숫자라고 하지만 문제 설명을 다시 자세히 읽어보면

 

각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자 

 

라고 적혀있다.

때문에 숫자에 0이 들어가면 안된다

ex) 100, 201, 550 (X)

그리고 서로 다른 숫자만 들어가야 한다

ex) 113, 111, 525 (X)

 

이 조건을 잘 기억하고 정답에 대한 검증을 한다.

 

숫자는 세자리이기 때문에 100 ~ 999까지의 숫자를 모두 확인하고

확인하는 법은 baseball 벡터에서 들어오는 숫자와 비교해서 스트라이크와 볼의 개수를 세어

baseball 벡터에서의 스트라이크와 볼을 비교한다.

그런식으로 한 정답에 대해 baseball 벡터를 모두 탐색했을 때 스트라이크와 볼의 개수가 모두 일치했을 때

정답의 후보로 카운트를 한다.

 

#include <string>
#include <vector>
#include <cstring>
using namespace std;

int solution(vector<vector<int>> baseball)
{
	int answer = 0;
	for (int i = 100; i <= 999; i++)
	{
		int target[3];
		target[0] = i / 100;
		target[1] = i / 10 % 10;
		target[2] = i % 10;
		if (target[0] == 0 || target[1] == 0 || target[2] == 0)
			continue;
		bool ok = true;
		for (int a = 0; a < 3; a++)
		{
			for (int b = a+1; b < 3; b++)
			{
				if (target[a] == target[b])
				{
					ok = false;
					break;
				}
			}
		}
		if(!ok) continue;
		for (auto b : baseball)
		{
			int predict = b[0];
			int strike = b[1];
			int ball = b[2];
			if (strike == 3)
				return 1;
			int prd[3];
			prd[0] = b[0] / 100;
			prd[1] = b[0] / 10 % 10;
			prd[2] = b[0] % 10;

			int cnt_stk = 0;
			int cnt_ball = 0;
			for (int a = 0; a < 3; a++)
			{
				for (int b = 0; b < 3; b++)
				{
					if (a == b && target[a] == prd[b])
					{
						cnt_stk += 1;
					}
					else if (a != b && target[a] == prd[b])
					{
						cnt_ball += 1;
					}
				}
			}
			if (!(cnt_stk == strike && cnt_ball == ball))
				ok = false;
		}
		if (ok)
		{
			answer += 1;
		}
	}
	return answer;
}

 

'ALGORITHM_PRACTICE' 카테고리의 다른 글

[프로그래머스] 땅따먹기  (0) 2019.12.07
[프로그래머스] 입국심사  (1) 2019.12.06
[프로그래머스] 여행경로  (0) 2019.09.27
[프로그래머스] 가장 큰 수  (0) 2019.09.27
백준 13171번: A  (0) 2019.09.26