숫자 야구 Pgs#42841

숫자 야구 PGs#42841

C++ 코드 보기
#include <string>
#include <vector>

using namespace std;

int is_strike(int i_100, int i_10, int i_1, int baseball) {	// i_100~1 = i의 백~일의 자리
	int base_a = baseball / 100;
	int base_b = (baseball / 10) % 10;
	int base_c = baseball % 10;

	int strike = 0;

	if (i_100 == base_a) strike++;		// 같은 자리, 같은 숫자가 있을 때
	if (i_10 == base_b) strike++;
	if (i_1 == base_c) strike++;

	return strike;
}

int is_ball(int i_100, int i_10, int i_1, int baseball) {	// i_100~1 = i의 백~일의 자리
	int base_a = baseball / 100;
	int base_b = (baseball / 10) % 10;
	int base_c = baseball % 10;

	int ball = 0;

	if (i_100 == base_b || i_100 == base_c) ball++;		// 자리가 다른 같은 수가 있을 때
	if (i_10 == base_a || i_10 == base_c) ball++;
	if (i_1 == base_a || i_1 == base_b) ball++;

	return ball;
}

int solution(vector<vector<int>> baseball) {
	int answer = 0;

	for (int i = 123; i < 987; i++) {
		int a = i / 100;			// i의 100의자리
		int b = (i / 10) % 10;		// i의 10의자리
		int c = i % 10;				// i의 1의자리
		if (a == b || b == c || a == c || a == 0 || b == 0 || c == 0) {
			continue;		// 중복된 수가 있거나, 0을 사용했으면 스킵
		}

		bool check = true;
		for (int j = 0; j < baseball.size(); j++) {
			if (is_strike(a, b, c, baseball[j][0]) == baseball[j][1] &&
				is_ball(a, b, c, baseball[j][0]) == baseball[j][2])
				continue;
			else { check = false; break; }
		}
		if (check == true)answer++;
	}

	return answer;
}

☝ 입력 형식

  • 숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.
  • 각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

🤞 출력 형식

  • 질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

🤟 구현 과정

1. 숫자 검사 하기

  • 0을 제외한 중복된 수가 없는 세 자릿수이므로 123~987 내의 수를 검사하는 방향으로 짜면 된다.
  • 범위 내의 모든 수에 대해 baseball이라는 배열에 주어진 스트라이크/볼을 만족하는지 검사하면 쉽게 답을 찾을 수 있다.

2. is_strike()

  • is_strike()의 경우, for 문 내의 i 값의 각각 백, 십, 일 자리와 baseball 배열의 세 자리 숫자 값에서 몇 개나 숫자와 자리가 모두 일치하는지 개수를 세는 함수다.

3. is_ball()

  • is_ball()의 경우, for 문 내의 i 값의 각각 백, 십, 일 자리와 baseball 배열의 세 자리 숫자 값에서 몇 개나 숫자가 같고, 자리는 다른지 개수를 세는 함수다.

🍀 Pain Points

1. 알고리즘 분류 안보고 풀기

항상 프로그래머스에서 문제를 풀 때, 분류를 생각하지 않고 문제를 풀어보려고 노력한다.

이 문제의 경우, 정말 탐색이라고 전제를 정한 후 문제를 해결하면 쉽게 풀 수 있다.

하지만 다른 방법으로도 풀 수 있나 생각해 보기 위해 처음에는 백, 십, 일의 자리를 각각의 차원으로 하는 배열 number[9][9][9]를 만들어서 풀어보려고 했었다.

될 거 같긴 한데.. strike가 일어날 때, 해당 배열에 어떤 변화를 주어야 할지 알 수 없어서 막혔다.

다른 방법을 생각해보다가 돌고 돌아 완전 탐색으로 돌아왔다.

댓글남기기