본문 바로가기

백준 문제풀이 코드저장소/Silver

Baekjoon 2503. 숫자 야구 / Python, Java

728x90

https://www.acmicpc.net/problem/2503

알고리즘 설명

문제 설명

숫자 야구 게임

세 자리 숫자를 맞춥니다.
말한 세 자리의 숫자 중에 위치와 숫자가 모두 일치하는 경우엔 스트라이크,
숫자는 정답숫자 안에 있으나, 위치가 다르다면 볼이 됩니다.

코드 설명

102 부터 987까지 모든 가능한 세자리 숫자를 생성한다.

스트라이크와 볼의 입력에 따라서 숫자 후보를 제거하는 방식

1. 자바코드

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

public class Main {
    public static ArrayList<String> arr = new ArrayList<>();
    public static ArrayList<String> noAns = new ArrayList<>();
    public static int n, res;
    public static BufferedReader br;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());  // 질문의 개수 입력

        // 123부터 987까지의 가능한 모든 숫자 생성
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
                for (int k = 1; k < 10; k++) {
                    if (i != j && i != k && j != k) {
                        arr.add(String.valueOf(100 * i + 10 * j + k));
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String tmp = st.nextToken();  // 세 자리 숫자
            int s = Integer.parseInt(st.nextToken());  // 스트라이크
            int b = Integer.parseInt(st.nextToken());  // 볼

            for (int j = 0; j < arr.size(); j++) {
                if (noAns.contains(arr.get(j))) {
                    continue;
                }
                int numS = 0;
                int numB = 0;
                for (int k = 0; k < 3; k++) {
                    if (tmp.charAt(k) == arr.get(j).charAt(k)) {
                        numS++;
                    } else if (arr.get(j).contains(String.valueOf(tmp.charAt(k)))) {
                        numB++;
                    }
                }
                if (s != numS || b != numB) {
                    noAns.add(arr.get(j));
                }
            }
        }
        System.out.println(arr.size() - noAns.size());  // 후보 개수 출력
    }
}

2. 파이썬 코드

arr = []
for i in range(1, 10):
    for j in range(1, 10):
        for k in range(1, 10):
            if i == j or j == k or k == i:
                continue
            arr.append(str(100 * i + 10 * j + k))

n = int(input())  # 질문의 개수 입력

no_ans = []  # 후보에서 제외할 숫자 리스트
for _ in range(n):
    tmp, s, b = map(int, input().split())
    tmp = str(tmp)
    for i in range(len(arr)):
        if arr[i] in no_ans:
            continue
        num_s, num_b = 0, 0
        for j in range(3):
            if tmp[j] in arr[i]:
                if arr[i][j] == tmp[j]:
                    num_s += 1
                else:
                    num_b += 1
        if s != num_s or b != num_b:
            no_ans.append(arr[i])

print(len(arr) - len(no_ans))  # 후보 개수 출력
반응형