정보문화진흥원 정보 영재 동아리에서 동아리 활동을 하던 영수와 민혁이는 쉬는 시간을 틈타 숫자야구 게임을 하기로 했다.
영수는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 마음속으로 생각한다. (예: 324)
민혁이는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 영수에게 묻는다. (예: 123)
민혁이가 말한 세 자리 수에 있는 숫자들 중 하나가 영수의 세 자리 수의 동일한 자리에 위치하면 스트라이크 한 번으로 센다. 숫자가 영수의 세 자리 수에 있긴 하나 다른 자리에 위치하면 볼 한 번으로 센다.
예) 영수가 324를 갖고 있으면
현재 민혁이와 영수는 게임을 하고 있는 도중에 있다.
민혁이가 영수에게 어떤 수들을 물어보았는지, 그리고 각각의 물음에 영수가 어떤 대답을 했는지가 입력으로 주어진다. 이 입력을 바탕으로 여러분은 영수가 생각하고 있을 가능성이 있는 수가 총 몇 개인지를 알아맞혀야 한다.
아래와 같은 경우를 생각해보자.
이때 가능한 답은 324와 328, 이렇게 두 가지이다.
영수는 동아리의 규율을 잘 따르는 착한 아이라 민혁이의 물음에 곧이곧대로 정직하게 답한다. 그러므로 영수의 답들에는 모순이 없다.
민혁이의 물음들과 각각의 물음에 대한 영수의 답이 입력으로 주어질 때 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력하는 프로그램을 작성하시오.
구현 브루트포스 알고리즘
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class NumberBaseball {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int answer = 0;
String[] numbers = new String[n];
int[] strikes = new int[n];
int[] balls = new int[n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
numbers[i] = st.nextToken();
strikes[i] = Integer.parseInt(st.nextToken());
balls[i] = Integer.parseInt(st.nextToken());
}
for (int i = 123; i < 988; i++) {
String str_number = Integer.toString(i);
boolean right = false;
int s = 0;
int b = 0;
// 숫자 내에 중복되는 수가 있는 경우 제외
if (str_number.charAt(0) == str_number.charAt(1) || str_number.charAt(1) == str_number.charAt(2) || str_number.charAt(0) == str_number.charAt(2)) {
continue;
} else if (str_number.charAt(0) == '0' || str_number.charAt(1) == '0' || str_number.charAt(2) == '0') continue; // 숫자 내에 0이 있는 경우 제
for (int j = 0; j < n; j++) {
String now_num = numbers[j]; // 질문한 숫자
for (int k = 0; k < 3; k++) {
char num = now_num.charAt(k);
for (int l = 0; l < 3; l++) {
char ans = str_number.charAt(l);
// strike
if (num == ans && k == l) {
s++;
} else if (num == ans && k != l) { // ball
b++;
}
}
}
// strike, ball의 개수가 같은 경우 right = true
if (strikes[j] == s && balls[j] == b) {
right = true;
} else {
right = false;
break;
}
s = 0;
b = 0;
}
// right == true이면 영수가 말한 모든 숫자와 strike, ball의 개수가 같은 것이므로
// answer += 1 해 준다
if (right) {
answer++;
}
}
System.out.println(answer);
}
}