BOJ2503 숫자 야구
문제
BOJ2503 숫자 야구
실버V | 백준 2503 | Python3 파이썬 풀이
알고리즘
- Python 라이브러리 itertools를 사용해 각 자리가 다른 숫자로 구성된 세 자리 수 리스트를 생성한다.
[ (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))
결과
Author And Source
이 문제에 관하여(BOJ2503 숫자 야구), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leehe228/boj2503저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)