[백준] 2503. 숫자 야구
문제 링크
풀이 과정
완전 탐색 문제입니다. 123부터 987까지의 숫자를 순회하며, 주어진 질문 정보를 바탕으로 가능성이 있는 숫자인지 판별합니다.
for (int i = 1; i <= 9; i++) {
used[i] = true;
for (int j = 1; j <= 9; j++) {
if (j == i) continue;
used[j] = true;
for (int k = 1; k <= 9; k++) {
if (k == j || k == i) continue;
used[k] = true;
if (check(i, j, k)) cnt++;
used[k] = false;
}
used[j] = false;
}
used[i] = false;
}
1부터 9까지의 사용 표시를 used
배열을 통해 하며, 123부터 987까지의 숫자를 만들어 check()
를 호출합니다.
static boolean check(int x, int y, int z) {
char[] now = (x + "" + y + z).toCharArray();
for (int i = 0; i < N; i++) {
int sc = 0, bc = 0;
for (int j = 0; j < 3; j++) {
if (now[j] == infos[i].question[j]) sc++;
else if (used[infos[i].question[j] - '0']) bc++;
}
if (sc != infos[i].strikeCnt || bc != infos[i].ballCnt) return false;
}
return true;
}
각 자리 수 x
, y
, z
를 문자 배열로 변환하여, 모든 질문에 대해 스트라이크 수와 볼 수를 셉니다. 같은 자리에 같은 숫자가 올 시 스트라이크 카운트를 증가시키며, 그렇지 않다면 다른 자리에 해당 숫자가 사용되었는지 used
배열을 통해 확인한 후 볼 카운트를 증가시킵니다.
모든 질문의 숫자에 대해 스트라이크 카운트와 볼 카운트가 일치할 시 가능성 있는 수로 여기고 true
를 리턴합니다.
코드
import java.util.Scanner;
public class Main {
static int N;
static Info[] infos;
static boolean[] used;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
infos = new Info[N];
used = new boolean[10];
int cnt = 0;
for (int i = 0; i < N; i++)
infos[i] = new Info(String.valueOf(sc.nextInt()).toCharArray(), sc.nextInt(), sc.nextInt());
for (int i = 1; i <= 9; i++) {
used[i] = true;
for (int j = 1; j <= 9; j++) {
if (j == i) continue;
used[j] = true;
for (int k = 1; k <= 9; k++) {
if (k == j || k == i) continue;
used[k] = true;
if (check(i, j, k)) cnt++;
used[k] = false;
}
used[j] = false;
}
used[i] = false;
}
System.out.println(cnt);
}
static boolean check(int x, int y, int z) {
char[] now = (x + "" + y + z).toCharArray();
for (int i = 0; i < N; i++) {
int sc = 0, bc = 0;
for (int j = 0; j < 3; j++) {
if (now[j] == infos[i].question[j]) sc++;
else if (used[infos[i].question[j] - '0']) bc++;
}
if (sc != infos[i].strikeCnt || bc != infos[i].ballCnt) return false;
}
return true;
}
static class Info {
char[] question;
int strikeCnt;
int ballCnt;
public Info(char[] question, int strikeCnt, int ballCnt) {
this.question = question;
this.strikeCnt = strikeCnt;
this.ballCnt = ballCnt;
}
}
}
댓글남기기