BOJ2503 숫자 야구
실버V | 백준 2503 | Python3 파이썬 풀이
[ (1, 2, 3), (1, 2, 4), ..., (7, 8, 9) ] # from itertools.combination
-> [ 123, 124, ..., 789 ]
# 숫자 두 개를 받아 볼과 스트라이크 개수를 반환하는 함수
def calsb(x : str, n : str) -> tuple:
s, b = 0, 0
for i in range(3):
for j in range(3):
# 위치가 같고, 숫자도 같다면 스트라이크
if i == j and x[i] == n[j]:
s += 1
# 위치는 다른데, 숫자가 같다면 볼
elif i != j and x[i] == n[j]:
b += 1
return (s, b)
import sys
from itertools import permutations
from collections import deque
input = sys.stdin.readline
# 숫자 두 개를 받아 볼과 스트라이크 개수를 반환하는 함수
def calsb(x : str, n : str) -> tuple:
s, b = 0, 0
for i in range(3):
for j in range(3):
# 스트라이크
if i == j and x[i] == n[j]:
s += 1
# 볼
elif i != j and x[i] == n[j]:
b += 1
return (s, b)
N = int(input())
# 각 자리수가 다른 수로 구성된 세 자리 수 리스트 생성
nums = [100*t[0] + 10*t[1] + t[2] for t in list(permutations([1,2,3,4,5,6,7,8,9], 3))]
# 소거할 수를 담을 스택
stack = deque()
for i in range(N):
x, s, b = map(int, input().split())
for n in nums:
# 숫자 리스트의 모든 값과 입력 값을 비교
# 볼과 스트라이크 값을 계산
ts, tb = calsb(str(x), str(n))
# 볼과 스트라이크 값이 하나라도 다르면 소거
if ts != s or tb != b:
stack.append(n)
# 스택에 담긴 모든 값을 리스트에서 소거
while stack:
nums.remove(stack.pop())
# 리스트에 남은 수의 개수 출력
print(len(nums))