이번에 풀어볼 문제는 우리가 어릴 때 자주 해보았던 숫자 야구게임이다.
핵심
완전 탐색 문제답게 가능한 모든 수를 대입해보아야 한다. 즉 123~987까지 해당 조건(스트라이크, 볼의 카운트)에 맞다면, 참이 되는 수를 1 추가한다.
정답 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [][] arr = new int[105][3];
int n = sc.nextInt();
for (int i=0;i<n;i++){
arr[i][0] = sc.nextInt(); //수
arr[i][1] = sc.nextInt(); //스트라이크
arr[i][2] = sc.nextInt(); //볼
}
int result =0;
for (int i=1;i<=9;i++){
for (int j=1;j<=9;j++){
for (int k=1;k<=9;k++){
if (i!=k&&i!=j&&j!=k){
boolean flag = false;
for (int m =0;m<n;m++){
int strike =0;
int ball=0;
int first = arr[m][0]/100;
int second = (arr[m][0]/10)%10;
int third = arr[m][0]%10;
if (i==first)strike++;
if (j==second)strike++;
if (k==third)strike++;
if (i==second||i==third)ball++;
if (j==first||j==third)ball++;
if (k==first||k==second)ball++;
if (strike!=arr[m][1]||ball!=arr[m][2])flag=true;
}
if (flag==false)result++;
}
}
}
}
System.out.println(result);
}
}
해설
배열 값에 숫자, 스트라이크수, 볼의 수를 넣는다.
이후 123~987까지 대입하여 조건을 비교한다.
123부터 987인 이유는 각 자릿수가 중복되면 안 되기 때문이다.
따라서 각 자릿수가 중복이 아닐 때만 아래 반복문을 실행한다.
해당 조건(배열에 저장된 수, 스트라이크 수, 볼의 수)을 비교한다.
해당 조건을 어기면 flag를 true로 변환시킨다.
만약 배열 0~N까지 반복했을 때, 1번도 조건을 어긴 적이 없다면 flag는 여전히 true이다.
따라서 정답 가능성이 있는 수가 된다.
개선점이나 오류가 있다면, 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
*완전 탐색* tetris (0) | 2022.09.29 |
---|---|
*완전 탐색* seat (0) | 2022.09.24 |
*완전 탐색* attackRange (1) | 2022.09.15 |
*완전탐색* colorpaper (0) | 2022.09.14 |
*완전 탐색* rook(java,알고리즘) (2) | 2022.09.11 |