백준 2503 - 자바

손찬호·2024년 6월 15일
0

알고리즘

목록 보기
63/91

풀이 아이디어

완전탐색

3중 for문으로 가능한 모든 3자리 숫자를 탐색하고
입력받은 테스트 케이스 {number, strike, ball}값을 NumberInfo 객체에 담아
ArrayList<NumberInfo> list에 저장한다.

3자리 숫자 중에서 같은 숫자가 나오는 경우(if(j==k || j==l || k==l))는
탐색하지 않는다. 또한 111~999 각각을 입력받은 테스트 케이스마다 strike, ball을
계산해서 해당 케이스와 일치하는 경우에만 int checkCount를 1 증가시키고
모든 테스트 케이스를 확인한 다음 모두 통과한다면 checkCount == list.size()가 되므로 정답 후보인 숫자로 간주해서 가능한 모든 정답 후보 숫자의 개수를 저장하는 변수
int answer를 1 증가시킨다.

풀이 코드

import java.util.*;
import java.io.*;

public class _2503{
    static int answer;
    public static class NumberInfo{
        int num;
        int strike;
        int ball;
        NumberInfo(int num, int strike, int ball){
            this.num = num;
            this.strike = strike;
            this.ball = ball;
        }
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine()); // 테스트 입력의 개수
        ArrayList<NumberInfo> list = new ArrayList<>(); // 테스트 입력을 저장하는 리스트
        for(int i=0;i<n;i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int num = Integer.parseInt(st.nextToken());
            int strike = Integer.parseInt(st.nextToken());
            int ball = Integer.parseInt(st.nextToken());

            list.add(new NumberInfo(num, strike, ball));
        }
        answer = 0;
        isValidNumber(list); // 가능한 숫자 찾기
        System.out.println(answer);
    }

    static void isValidNumber(ArrayList<NumberInfo> list){
        
        // 첫번째 자리
        for(int j=1;j<=9;j++){
            // 두번째 자리
            for(int k=1;k<=9;k++){
                // 세번째 자리
                for(int l=1;l<=9;l++){
                    // 중복되는 숫자가 있는 경우
                    if(j==k || j==l || k==l){
                        continue;
                    }
                  
                    // 모든 조건을 만족하는지 확인
                    int checkCount = 0; // 테스트 입력을 만족하는지 확인하는 변수
                    for(NumberInfo info : list){
                        // strike와 ball이 같은 숫자인지 확인
                        int s = 0;
                        int b = 0;

                        int num = info.num;
                        int strike = info.strike;
                        int ball = info.ball;
                        
                        // strike 확인 - 숫자와 자리가 같으면 strike
                        if(j == num/100){
                            s++;
                        }
                        if(k == (num%100)/10){
                            s++;
                        }
                        if(l == num%10){
                            s++;
                        }
    
                        // ball 확인 - 숫자는 같지만 자리가 다르면 ball
                        if(j == (num%100)/10 || j == num%10){
                            b++;
                        }
                        if(k == num/100 || k == num%10){
                            b++;
                        }
                        if(l == num/100 || l == (num%100)/10){
                            b++;
                        }
                        
                        // 임의의 숫자의 s, b와 strike, ball가 다르면 정답이 될 수 없는 숫자이므로 
                        // 다음 숫자로 넘어간다.
                        if(s != strike || b != ball){
                            break;
                        }
                        checkCount++;
                    }
                    // 모든 테스트 입력을 만족하는 숫자인 경우 정답후보군에 추가
                    if(checkCount == list.size()){
                        answer++;
                    }
                }
            }
        }
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보