맛있는물회

[맛있는물회] <programmers 알고리즘> "숫자 야구" 본문

IT/알고리즘

[맛있는물회] <programmers 알고리즘> "숫자 야구"

맛있는물회 2020. 4. 15. 23:23

문제 조건


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

 

Input


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

 

Output


 

생각한 아이디어


처음에는 접근을 잘 못하여서 꽤 고생했다.

딕셔너리를 사용해서 모든 값에 strike랑 ball을 입력하려 했는데 너무 힘들었다.

 

그래서 조금 직관적으로 123 ~ 987까지니깐 순열 조합을 사용하면 어떨까 라는 생각으로 접근을 하였다.

 

그래서 모든 값을 조합으로 만들어버리고 주어진 질문의 값을 비교해가며 끝까지 수행하였다.

 

생각보다 쉽게 풀렸다.

 

스트라이크의 경우는 세자리 수를 차례로 비교하며 계산하고, 볼 같은 경우는 in 을 사용하여 검색한 뒤 스트라이크의 수를 빼주는 방법으로 수행하였다.

 

소스코드


from itertools import combinations,permutations
def solution(baseball):
    answer = 0
    ball = [1,2,3,4,5,6,7,8,9]

    for val in permutations(ball,3):
        for i in range(0,len(baseball)):
            play = str(baseball[i][0])

            cnt = 0
            flag = 0
            for j in range(0,3):
                if int(play[j]) == val[j]: 
                    cnt +=1
            if cnt == baseball[i][1]: 
                    flag = 1 #스트라이크 개수 맞으면

            if flag == 0: #스트라이크 개수 안맞음
                break

            cnt = 0
            flag = 0
            for j in range(0,3):
                if int(play[j]) in val: cnt +=1
                
            if (cnt-baseball[i][1]) == baseball[i][2]: flag = 1 #볼 개수 맞으면

            if flag == 0: #볼 개수 안맞음
                break

            if i == (len(baseball) - 1):
                answer +=1
            continue

    #dfs(0,answer, baseball)

    print(answer)
    return answer

 

*파이썬 문법 정리

Comments