문제
- 숫자야구
- A : 1~9 사이의 3개 숫자를 생각한다. (예 - 324)
- B : 1~9 사이의 3개 숫자를 묻는다. (예 - 123)
- A : 동일한 숫자가 동일한 자리에 있으면 스트라이크 숫자는 있지만 다른 자리에 위치하면 볼 한 번으로 카운트
(예 - 2 스트라이크, 0 볼)
- B가 질문한 숫자들과 A의 답변이 주어질 때, A가 처음 생각한 3자리 숫자가 될 수 있는 경우의 수 구하기
- 1 <= (질문 개수) <= 100
풀이
- 3자리 숫자를 맞추는 것이 아니라 경우의 수를 모두 구해야하는 문제!
- 3자리 숫자는 111 ~ 999 까지 총 889개 숫자이므로 경우의 수를 줄여가는 것이 좋겠다.
- 전체 숫자 조합 중 만들 수 없는 숫자 (strike, ball 개수가 다른 경우)를 제거하기
from itertools import permutations
N = int(input())
numbers = set(permutations([i for i in range(1, 10)], 3)) # 전체 숫자 조합
for _ in range(N):
num, strike, ball = map(int, input().split())
num = list(map(int, str(num)))
new_numbers = set()
for x in numbers: # 각 경우의 수에 대해
s_cnt = b_cnt = 0
for i in range(3): # 정답 자릿수에 대해서
if num[i] in x:
if num[i] == x[i] :
s_cnt += 1
else :
b_cnt += 1
if strike == s_cnt and ball == b_cnt : # 만들 수 있는 숫자
new_numbers.add(x)
numbers = new_numbers
if len(numbers) == 0:
break
print(len(numbers))
References
- 백준 2503
- 2023.05.11 오늘의 문제