Algorithm

[백준] 2503 숫자야구 Java

소스코드는 Github에서도 확인하실 수 있습니다.

 

풀이 🚀

1~9까지 중복되지 않는 세자리 수만 가능하므로, 123 ~ 987까지 모두 순회하며 주어진 조건을 모두 만족하는지 확인한다.

주어진 조건

* Input으로 들어온 수와 strike, ball 수를 비교했을 때 같다.

* 1~9까지 중복되지 않는 세자리 수로 이루어져있다.

 

모든 조건을 만족한다면 가능한 답에 포함되므로 answer를 1 증가시킨다.

 

소스코드 👩🏻‍💻

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        List<BaseBallData> inputDatum = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            inputDatum.add(
                new BaseBallData(st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()))
            );
        }

        System.out.println(playBaseBall(inputDatum));
    }

    private static int playBaseBall(List<BaseBallData> inputDatum) {
        int answer = 0;

        // 1~9까지 서로 다른 숫자 3개
        for (int number = 123; number <= 987; number++) {
            if (hasSameOrContainsZero(number)) {
                continue;
            }

            int allCasePass = 0;
            for (BaseBallData baseBallData : inputDatum) {
                final String source = baseBallData.number;
                final String target = String.valueOf(number);
                // strike 개수 확인
                final int strike = countStrike(source, target);
                // ball 개수 확인
                final int ball = countBall(source, target);
                // baseBallData와 일치하는지 확인
                if (strike == baseBallData.strike && ball == baseBallData.ball) {
                    allCasePass++;
                } else {
                    break;
                }
            }

            if (allCasePass == inputDatum.size()) {
                answer++;
            }
        }

        return answer;
    }

    private static int countStrike(String source, String target) {
        int strike = 0;
        for (int i = 0; i < 3; i++) {
            if (source.charAt(i) == target.charAt(i)) {
                strike++;
            }
        }
        return strike;
    }

    private static int countBall(String source, String target) {
        int ball = 0;
        for (int i = 0; i < 3; i++) {
            if (source.charAt(i) == target.charAt((i + 1) % 3) ||
                source.charAt(i) == target.charAt((i + 2) % 3)) {
                ball++;
            }
        }
        return ball;
    }

    private static boolean hasSameOrContainsZero(int number) {
        String sNumber = String.valueOf(number);
        Set<Character> chars = new HashSet<>();
        for (int i = 0; i < sNumber.length(); i++) {
            chars.add(sNumber.charAt(i));
        }

        return chars.contains('0') || chars.size() != 3;
    }

    static class BaseBallData {

        String number;
        int strike;
        int ball;

        public BaseBallData(String number, int strike, int ball) {
            this.number = number;
            this.strike = strike;
            this.ball = ball;
        }
    }
}