[백준] 2503. 숫자 야구

2 분 소요

문제 링크

[백준] 2503. 숫자 야구


풀이 과정

완전 탐색 문제입니다. 123부터 987까지의 숫자를 순회하며, 주어진 질문 정보를 바탕으로 가능성이 있는 숫자인지 판별합니다.


for (int i = 1; i <= 9; i++) {
    used[i] = true;

    for (int j = 1; j <= 9; j++) {
        if (j == i) continue;

        used[j] = true;

        for (int k = 1; k <= 9; k++) {
            if (k == j || k == i) continue;

            used[k] = true;
            if (check(i, j, k)) cnt++;
            used[k] = false;
        }

        used[j] = false;
    }

    used[i] = false;
}

1부터 9까지의 사용 표시를 used 배열을 통해 하며, 123부터 987까지의 숫자를 만들어 check() 를 호출합니다.


static boolean check(int x, int y, int z) {
    char[] now = (x + "" + y + z).toCharArray();

    for (int i = 0; i < N; i++) {
        int sc = 0, bc = 0;

        for (int j = 0; j < 3; j++) {
            if (now[j] == infos[i].question[j]) sc++;
            else if (used[infos[i].question[j] - '0']) bc++;
        }

        if (sc != infos[i].strikeCnt || bc != infos[i].ballCnt) return false;
    }

    return true;
}

각 자리 수 x, y, z문자 배열로 변환하여, 모든 질문에 대해 스트라이크 수볼 수를 셉니다. 같은 자리에 같은 숫자가 올 시 스트라이크 카운트를 증가시키며, 그렇지 않다면 다른 자리에 해당 숫자가 사용되었는지 used 배열을 통해 확인한 후 볼 카운트를 증가시킵니다.

모든 질문의 숫자에 대해 스트라이크 카운트와 볼 카운트가 일치할 시 가능성 있는 수로 여기고 true를 리턴합니다.


코드

import java.util.Scanner;

public class Main {
    static int N;
    static Info[] infos;
    static boolean[] used;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        infos = new Info[N];
        used = new boolean[10];
        int cnt = 0;

        for (int i = 0; i < N; i++)
            infos[i] = new Info(String.valueOf(sc.nextInt()).toCharArray(), sc.nextInt(), sc.nextInt());

        for (int i = 1; i <= 9; i++) {
            used[i] = true;

            for (int j = 1; j <= 9; j++) {
                if (j == i) continue;

                used[j] = true;

                for (int k = 1; k <= 9; k++) {
                    if (k == j || k == i) continue;

                    used[k] = true;
                    if (check(i, j, k)) cnt++;
                    used[k] = false;
                }

                used[j] = false;
            }

            used[i] = false;
        }

        System.out.println(cnt);
    }

    static boolean check(int x, int y, int z) {
        char[] now = (x + "" + y + z).toCharArray();

        for (int i = 0; i < N; i++) {
            int sc = 0, bc = 0;

            for (int j = 0; j < 3; j++) {
                if (now[j] == infos[i].question[j]) sc++;
                else if (used[infos[i].question[j] - '0']) bc++;
            }

            if (sc != infos[i].strikeCnt || bc != infos[i].ballCnt) return false;
        }

        return true;
    }

    static class Info {
        char[] question;
        int strikeCnt;
        int ballCnt;

        public Info(char[] question, int strikeCnt, int ballCnt) {
            this.question = question;
            this.strikeCnt = strikeCnt;
            this.ballCnt = ballCnt;
        }
    }
}

카테고리:

업데이트:

댓글남기기