본문 바로가기

Algorithm Problems/완전 탐색

[백준/Python] 2503번: 숫자 야구

문제

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


문제 요약

영수가 생각한 1부터 9까지 서로 다른 숫자 세 개로 구성된 세 자리 수를 N번 물어본다.

 

물어본 수와 스트라이크와 볼 개수를 입력한다.

 

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


코드

from itertools import permutations

N = int(input())

data = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
arr = list(permutations(data, 3))
# arr은 1 ~ 9까지 숫자로 만들 수 있는 모든 세 자리 수들의 배열 (9P3)

for _ in range(N):
    n, s, b = map(int, input().split())
    n = list(str(n))
    cnt = 0 # 제거된 숫자 조합의 개수

    # arr[0]부터 검사 시작
    for i in range(len(arr)): # 현재 가능한 경우의 수만큼 반복
        strike = ball = 0
        # 스트라이크, 볼 개수

        i -= cnt 
        # i는 제거되지 않은 숫자만큼 건너뛰고 탐색
        # 예를 들어 현재 루프까지 4개가 조건에 부합하여 제거되지 않았다면, i는 arr의 5번째 수부터 탐색
        # 제거되었다면 i가 1 증가한 만큼 cnt도 증가하였기 때문에 제자리

        # arr[i]와 입력 받은 질문 n을 비교하여 strike와 ball 개수 탐색
        for j in range(3):
            if arr[i][j] == n[j]: # 위치와 값이 같다면
                strike += 1 # 스트라이크
            elif n[j] in arr[i]: # 안에 존재한다면
                ball += 1 # ball

        if strike != s or ball != b: # 입력 받은 스트라이크, 볼 개수와 다르다면
            arr.remove(arr[i]) # 배열에서 제거 (소거)
            cnt += 1 # 제거된 개수 증가

    #print(arr)
    
print(len(arr))

코드 설명

1. 1부터 9까지로 만들 수 있는 모든 세 자리수들을 배열 arr에 저장한다.

 

2. 입력된 수 n과 배열에 존재하는 모든 수를 하나씩 비교해보며 조건에 맞지 않은 값들을 제거한다.

 

3. N번의 입력이 종료되면, 배열에 남은 개수를 출력한다.