숫자 야구 (python)

SeoYng·2020년 9월 6일
0
post-custom-banner

itertools.permutations 사용 (순열), 모든 경우를 확인해야 하는 문제

👀 깃헙 소스

문제설명

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.
각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.

숫자는 맞지만, 위치가 틀렸을 때는 볼
숫자와 위치가 모두 맞을 때는 스트라이크
숫자와 위치가 모두 틀렸을 때는 아웃
예를 들어, 아래의 경우가 있으면
A : 123
B : 1스트라이크 1볼.
A : 356
B : 1스트라이크 0볼.
A : 327
B : 2스트라이크 0볼.
A : 489
B : 0스트라이크 1볼.

이때 가능한 답은 324와 328 두 가지입니다.
질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

입출력 예

baseball						return
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]]	2

솔루션

123 ~ 987까지 순열을 구하여 모든 경우를 cand에 저장한다.
하나씩 질문지와 비교하면서 모든 질문지를 만족하는 경우 answer에 1을 더해준다.

코드

# 파이썬
import itertools
from collections import deque


def solution(baseball):
    cand = deque(itertools.permutations(range(1, 10), 3))
    answer = 0

    while cand:
        cand_num = cand.popleft()

        for num, strike, ball in baseball:
            num = [int(c) for c in str(num)]
            s_count, b_count = 0, 0

            for n, target in zip(num, cand_num):
                if n in cand_num:
                    if n == target:
                        s_count += 1
                    else:
                        b_count += 1

            if strike != s_count or ball != b_count:
                break
        else:
            answer += 1

    return answer
profile
Junior Web FE Developer
post-custom-banner

0개의 댓글