BOJ2503 숫자 야구

leehe228·2021년 8월 18일
0
post-thumbnail

문제

BOJ2503 숫자 야구
실버V | 백준 2503 | Python3 파이썬 풀이


알고리즘

  1. Python 라이브러리 itertools를 사용해 각 자리가 다른 숫자로 구성된 세 자리 수 리스트를 생성한다.
[ (1, 2, 3), (1, 2, 4), ..., (7, 8, 9) ] # from itertools.combination
-> [ 123, 124, ..., 789 ]
  1. 리스트에 모든 숫자에 대해 입력된 숫자와 볼, 스트라이크 개수를 비교한다. 개수가 다르다면 소거한다.
# 숫자 두 개를 받아 볼과 스트라이크 개수를 반환하는 함수
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)
  1. 입력 후 리스트에서 남은 수의 개수를 출력한다.

코드

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))

결과

profile
건국대학교 컴퓨터공학부 이호은 | 알고리즘 정리 블로그

0개의 댓글