흙금이네 블로그

[BOJ] 2503 - 숫자 야구 (Python, JavaScript) 본문

알고리즘

[BOJ] 2503 - 숫자 야구 (Python, JavaScript)

흙금 2023. 2. 1. 00:21

 

 

아이디어

 

가능한 세 자릿수에서 각 질문에 대한 대답에 따라 불가능한 경우를 제외해 나간다.

 

 

풀이 #1 (Python)

 

세트 numbers에 1~9의 숫자 중 서로 다른 숫자 세 개로 구성된 세 자릿수를 문자열로 저장한다.

질문마다 질문한 숫자는 문자열로 Q에, 스트라이크 개수와 볼 개수는 정수로 strike와 ball에 저장한다.

numbers에 있는 수를 구성하는 각 숫자가 Q와 자릿값까지 같으면 s를, 그렇지 않고 Q에 포함되면 b를 증가시킨다.

해당 숫자의 s와 b가 각각 strike와 ball에 같다면 temp에 추가하고, for문 종료 후에 기존의 numbers를 temp로 대체한다.

 

import sys

input = sys.stdin.readline

def solution():
    numbers = set()
    for i in range(1, 10):
        for j in range(1, 10):
            for k in range(1, 10):
                if i != j and j != k and i != k:
                    numbers.add(f'{i}{j}{k}')
    N = int(input())
    for _ in range(N):
        Q, strike, ball = input().split()
        strike, ball = map(int, [strike, ball])
        temp = set()
        for num in numbers:
            s = b = 0
            for i in range(3):
                if num[i] == Q[i]:
                    s += 1
                elif num[i] in Q:
                    b += 1
            if s == strike and b == ball:
                temp.add(num)
        numbers = temp
    print(len(numbers))

solution()

 

 

 

풀이 #2 (JavaScript)

 

풀이 #1과 같은 방식으로 동작하며, 자바스크립트의 자료구조 Set은 size로 그 크기를 구한다.

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

let numbers = new Set();
for (let i=1; i<10; i++) {
    for (let j=1; j<10; j++) {
        for (let k=1; k<10; k++) {
            if (i != j && j != k && i != k) {
                numbers.add(String(i*100+j*10+k));
            }
        }
    }
}
const N = Number(input[0]);
for (let i=1; i<N+1; i++) {
    let [Q, strike, ball] = input[i].split(' ');
    [strike, ball] = [strike, ball].map(Number);
    temp = new Set();
    for (let num of numbers) {
        let s = b = 0;
        for (let j=0; j<3; j++) {
            if (num[j] === Q[j]) s++;
            else if (Q.includes(num[j])) b++;
        }
        if (s === strike && b === ball) temp.add(num);
    }
    numbers = temp;
}
console.log(numbers.size);

 

Comments