티스토리 뷰

숫자 야구

문제 설명

숫자 야구 게임이란 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


이 숫자야구 문제는 우리가 평소 생각하던 답인 숫자를 도출해야하는 숫자야구와는 다르다.

이 문제는 몇몇 대답을 보고 가능한 숫자들의 후보의 수를 리턴해야하는 문제다.

처음 걸러지기 전의 숫자들은 [1,2,3] 부터 [9,8,7]로, 생각보다 많지 않기 때문에 완전탐색을 이용해도 효율적으로 답을 도출해낼 수 있을 것이다.

 

일단 all_num 함수로 순열을 이용하여 [1,2,3] 부터 [9,8,7] 까지 중복 없는 숫자 세트들을 생성하였다.

 

check_guess(guess, num) 함수에서는, guess로 들어오는 것은 baseball 입력값들이 하나하나 들어온다. 그러면 guess[1]은 입력으로 주어진 스트라이크 개수이고 guess[2]는 볼 개수이다. 입력으로 주어진 스트라이크, 볼은 각각 guess_s, guess_b에 저장한다.

그리고 num에는 [1,2,3] 에서 [9,8,7] 숫자가 들어온다.

num을 가지고 직접 guess[0]의 숫자와 비교하여 실제 strike, ball 개수를 계산한다. 이 과정을 노가다로 아래처럼 구현할 수도 있고, 주석처리된 곳처럼 for문과 if문을 이용할 수도 있다. 

이렇게 직접 계산한 strike, ball 개수와 주어진 guess_s, guess_b 개수가 같다면 True을 리턴, 다르다면 False을 리턴한다

 

마지막 solution 함수에서는 all_num에서 생성한 모든 숫자들을 완전탐색으로 돌면서, baseball의 모든 케이스에서 True가 나온 숫자들의 개수를 센다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from itertools import permutations
def all_num(): #123-987 
    numbers=list(range(1,10))
    all_number=list(permutations(numbers, 3))
    return all_number
 
def check_guess(guess,num): 
    # baseball에 주어진 s,b수와 실제 s,b수 비교해서 같으면 T, 다르면 F 반환
    
    guess_num=[int(i) for i in str(guess[0])]
    guess_s=guess[1]; guess_b=guess[2]
    strike,ball=0,0
    
    if guess_num[1]==num[1]:
        strike+=1
    if guess_num[2]==num[2]:
        strike+=1
    if guess_num[0]==num[0]:
        strike+=1
    if guess_num[0]==num[1or guess_num[0]==num[2]:
        ball+=1
    if guess_num[1]==num[2or guess_num[1]==num[0]:
        ball+=1
    if guess_num[2]==num[0or guess_num[2]==num[1]:
        ball+=1
    
    '''위의 노가다 방법이 싫으면 아래 방법 사용
    for i in range(3):
        if guess_num[i]==num[i]:
            strike+=1
            continue
        if guess_num[i] in num:
            ball+=1
    print(guess_num,"내가 구한 s,b=",strike, ball,"주어진 s,b=",guess_s,guess_b)
    '''
    if guess_s==strike and guess_b==ball:
        return True
    else :
        return False
 
def solution(baseball):
    all_numbers=all_num() #(1,2,3)~(9,8,7)
    answer=0
    for num in all_numbers:
        flag=True
        for guess in baseball:
            if check_guess(guess, num)==False:
                flag=False
        if flag==True: #baseball의 모든 케이스에서 True가 나왔을 경우 answer+1
            answer+=1
 
    return answer
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter