백준 숫자 야구

KIMYEONGJUN·2025년 3월 10일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다.
이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.

첫 줄에 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력한다.

내가 이 문제를 보고 생각해본 부분

입력 처리: BufferedReader를 사용하여 입력을 받는다.
첫 번째 줄에서 질문의 개수를 읽고, 이후 각 질문에 대한 정보(세 자리 수, 스트라이크 수, 볼 수)를 배열에 저장한다.
후보 수 생성: 123부터 987까지의 숫자 중에서 서로 다른 세 자리 수를 생성합니다. 이때 0이 포함되거나 숫자가 중복되면 후보에서 제외한다.
조건 검증: 각 후보 수에 대해 모든 질문에 대한 스트라이크와 볼 수를 계산하여 입력된 값과 비교한다.
만약 모든 질문에 대해 일치하면 유효한 후보 수로 카운트한다.
결과 출력: 최종적으로 가능한 후보 수를 StringBuilder를 이용해 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 2503번 문제
public class Main957 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        String[][] questions = new String[N][3];
        for(int i = 0; i < N; i++) {
            questions[i] = br.readLine().split(" ");
        }

        int count = 0;
        for(int i = 123; i <= 987; i++) {
            String candidate = String.valueOf(i);
            // 숫자가 서로 다르고 0이 포함되지 않아야 함
            if(candidate.charAt(0) == '0' || candidate.charAt(1) == '0' || candidate.charAt(2) == '0' ||
                    candidate.charAt(0) == candidate.charAt(1) || candidate.charAt(0) == candidate.charAt(2) || candidate.charAt(1) == candidate.charAt(2)) {
                continue;
            }
            boolean isValid = true;
            for(String[] question : questions) {
                int strikes = Integer.parseInt(question[1]);
                int balls = Integer.parseInt(question[2]);
                int[] result = getStrikeBallCount(candidate, question[0]);
                if(result[0] != strikes || result[1] != balls) {
                    isValid = false;
                    break;
                }
            }
            if(isValid) {
                count++;
            }
        }

        StringBuilder sb = new StringBuilder();
        sb.append(count);
        System.out.println(sb.toString());
        br.close();
    }

    private static int[] getStrikeBallCount(String candidate, String question) {
        int strikes = 0;
        int balls = 0;

        // 스트라이크 계산
        for(int i = 0; i < 3; i++) {
            if(candidate.charAt(i) == question.charAt(i)) {
                strikes++;
            }
        }

        // 볼 계산
        for(int i = 0; i < 3; i++) {
            if(candidate.charAt(i) != question.charAt(i) && question.indexOf(candidate.charAt(i)) != -1) {
                balls++;
            }
        }

        return new int[] {strikes, balls};
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글