archive

[백준] 숫자 야구 게임 (Python) 본문

STUDY/알고리즘

[백준] 숫자 야구 게임 (Python)

seonyounggg 2021. 3. 8. 21:23

✏️ 문제

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

✏️ 풀이

123부터 987까지의 모든 후보 중,

한 번 물어볼때마다 후보가 될 수 없는 원소는 삭제한다.

대답한 숫자를 포함하고 있고 자리가 같으면 strike, 다르면 ball 

각 개수를 세어서 대답한 strike, ball과 다를 경우 배열에서 삭제한다.

✏️ 코드

import itertools

n = int(input())
answer = list(itertools.permutations([x for x in range(1, 10)], 3))

for _ in range(n):
    ans, strike, ball = map(int, input().split())
    ans = str(ans)
    if strike==3 or (strike==1 and ball==2):
        print(1)
        break

    cnt_remove = 0
    for idx in range(len(answer)):
        idx -= cnt_remove
        cnt_strike = 0
        cnt_ball = 0
        for i in range(3):
            if int(ans[i]) in answer[idx]:
                if i != answer[idx].index(int(ans[i])):
                    cnt_ball += 1
                else:
                    cnt_strike += 1
        if cnt_ball != ball or cnt_strike != strike:
            answer.remove(answer[idx])
            cnt_remove += 1
else:
    print(len(answer))

인덱스 오류를 방지하기 위해 삭제한 배열의 수를 저장하여 for문을 돌 때 빼준다.

✏️생각

처음에 풀이할 때 각 answer에 따라 후보가 될 수 있는 것을 직접 구하려고 했는데 훨씬 어려웠다 ㅠ 경우의 수도 많고..

그것보다는 후보를 검사해서, 각 answer에 해당하지 않으면 제외하는 것으로!! 이게 실제 게임 방법에도 가까우니

'STUDY > 알고리즘' 카테고리의 다른 글

[백준] 숫자 카드  (0) 2021.03.29
[백준] 설탕 배달 (Python)  (0) 2021.03.08
[백준] 체스판 다시 칠하기 (Python)  (0) 2021.03.08
[백준] 분해합 (Python)  (0) 2021.03.08
[백준] 블랙잭 (Python)  (0) 2021.03.08
Comments