[BOJ] 3503 숫자야구

iinnuyh_s·2024년 1월 22일
0

완전탐색

목록 보기
3/4
post-thumbnail

숫자야구

풀이

  • 민혁이가 질문하는 세자리 숫자마다 영수가 스트라이크, 볼 개수를 알려준다.
  • 이를 통해 영수가 생각하는 답이 가능한 정수의 개수를 구해라.
  • 이 문제 어떻게 접근해야할지 갈피를 못 잡았었다. 풀이를 참고했는데, 111~999까지의 숫자 배열을 먼저 만들어둔다.(영수가 생각하는 수는 1~9까지 서로 다른 세개의 숫자로 구성된 세자리 수이므로.)
  • 그리고 나서, 민혁이의 추측에 대한 영수의 답을 통해 "절대 될 수 없는 숫자"들을 지워나간다. 예를 들면
    429는 1스트라이크 1볼이다 라면, 111~999까지 돌면서 429와 비교해서 1스트라이크 1볼이 안나오는 애들을 다 지우는 것.
  • strike+ball 개수만큼 겹치는 수가 있는지 확인한 뒤에, 자리까지 같은 스트라이크 수가 같은지 확인해준다. 다른 부분이 있다면 arr[m]=0 으로 설정.
  • arr[m]!=0 인 애들을 센다.이 때, "서로 다른 세자리 수"가 아닌 애들도 다 지운다. 0이 들어가는 애들도 지운다.

정답 풀이

import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N =Integer.parseInt(br.readLine());
        StringTokenizer st;
        int[] arr = new int[889];
        int[][] strArr = new int[889][3];
        int answer = 0;
        for(int i=0;i<889;i++){
            arr[i] = 111+i;
            strArr[i][0] = arr[i]/100;
            strArr[i][1] = (arr[i]%100)/10;
            strArr[i][2] = (arr[i]%100)%10;
        }
        for(int i=0;i<N;i++){
            st = new StringTokenizer(br.readLine());
            String minhyk = st.nextToken();
            int strike = Integer.parseInt(st.nextToken());
            int ball = Integer.parseInt(st.nextToken());
            int[] temp = new int[3];
            for(int j=0;j<minhyk.length();j++){
                temp[j] = Integer.parseInt(String.valueOf(minhyk.charAt(j)));
            }
            int posCnt = strike+ball;
            for(int m=0;m<strArr.length;m++){
                int[] now = strArr[m];
                int cnt = 0;
                int strikeCnt = 0;
                for(int n=0;n<3;n++){
                    int tempR = temp[n];
                    for(int l=0;l<3;l++){
                        if(tempR==now[l]){
                            cnt++;
                        }
                    }
                }
                if(cnt!=posCnt){
                    arr[m]=0;
                }
                else{
                    for(int l=0;l<3;l++){
                        if(temp[l]==strArr[m][l]){
                            strikeCnt++;
                        }
                    }
                    if(strikeCnt!=strike) arr[m]=0;
                }
            }
        }
        for(int k=0;k<arr.length;k++){
            if(arr[k]!=0 && strArr[k][0]!=strArr[k][1] && strArr[k][1]!=strArr[k][2] &&strArr[k][0]!=strArr[k][2]) {
                if(strArr[k][0]!=0 && strArr[k][1]!=0 && strArr[k][2]!=0) {
                    answer++;
                }
            }
        }
        System.out.println(answer);
    }
}

0개의 댓글