[문제풀이] 숫자 야구
업데이트:
문제 링크 : 숫자 야구
풀이 시간 : 15분
1. 문제 풀이
완전 탐색을 하면서 조건에 맞는 조합의 수를 찾는다.
1) 각 자리가 서로 겹치지 않는 조합을 찾는다(3중 for문)
2) 그 조합이 입력으로 들어온 조건에 부합하는지 판별
3) 부합하면 answer를 증가한다
2. 소스 코드
static public int solution(int[][] baseball) {
int answer = 0;
// 3자리라서 3중 for문을 이용해서 완전 탐색을 진행
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
// 중복이 안되기 때문
if (j != i) {
for (int k = 1; k <= 9; k++) {
// 중복이 안되기 때문
if(k!=j && k!=i) {
boolean flag = true;
// 입력을 비교하여 조건에 부합하는지 찾는다
for (int l = 0; l < baseball.length; l++) {
int strike = 0;
int ball = 0;
int temp = baseball[l][0];
int[] num = new int[3];
num[0] = temp/100;
temp =temp%100;
num[1] = temp/10;
temp = temp% 10;
num[2] = temp;
// 첫번째 자리
if(num[0] ==i) {
strike++;
}else if(i==num[1] || i==num[2]) {
ball++;
}
// 두번째 자리
if(num[1] ==j) {
strike++;
}else if(j==num[0] || j==num[2]) {
ball++;
}
// 세번째 자리
if(num[2] ==k) {
strike++;
}else if(k==num[1] || k==num[0]) {
ball++;
}
// 입력이랑 하나라도 틀리면 불가능 하기 때문
if(strike != baseball[l][1] || ball != baseball[l][2]) {
flag = false;
break;
}
}
if(flag) {
answer++;
}
}
}
}
}
}
return answer;
}
3. 후기
조건이 3자리 뿐이라서 완전 탐색으로 찾을 수 있는 문제다
strike와 ball의 판단하는 것이 관건이다
각 자리의 숫자가 중복이 안되기 때문에
각 자리별로 strike인지 확인하고 아니면 ball인지 판별했다.