알고리즘/프로그래머스

[프로그래머스 Level 2] 숫자 야구 - 파이썬(Python)

me1 2020. 7. 15. 21:54

문제 설명


숫자 야구 게임이란 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 함수를 작성해주세요.

 

제한조건

 

  • 질문의 수는 1 이상 100 이하의 자연수입니다.
  • baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

 

 

입출력 예

 

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

 

나의 풀이

 

from itertools import permutations

def solution(baseball):
    a=list(permutations(range(1,10),3))
    r=0
    for i in a:
        ans=i
        c=0
        for b in baseball:
            st=0
            ba=0
            ch=list(map(int,(str(b[0]))))
            for j in range(3):
                if ans[j] == ch[j]:
                    st += 1
            for k in ch:
                if k in ans:
                    ba += 1
            ba -= st
            if b[1] == st and b[2] == ba:
                c += 1
        if c == len(baseball):
            r += 1
    return r

1. 1부터 9까지 중 숫자야구의 숫자가 될 수있는 것을 순열을 이용해 뽑습니다.
2. 해당 숫자가 baseball을 통해 숫자야구의 답이 될 수 있는지 확인합니다.
2-1. 스트라이크의 개수를 구합니다.
2-2. 볼의 개수를 구합니다. 볼의 개수를 구하는 것에 스트라이트도 포함되어 있기 때문에 스트라이크
개수를 뺍니다.
2-3. 스트라이크와 볼의 개수가 baseball의 개수와 같은지 확인합니다.
2-4. 각 baseball의 경우를 계산하고 c가 baseball의 길이와 같으면 숫자야구의 답이 될 수 있기 때문에 r에 1을 더합니다.
3. 순열에 대해 모두 검사하고 r을 리턴합니다.

 


프로그래머스 '숫자 야구' : https://programmers.co.kr/learn/courses/30/lessons/42841

 

코딩테스트 연습 - 숫자 야구

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

programmers.co.kr