Notice
Recent Posts
Recent Comments
Link
archive
[백준] 숫자 야구 게임 (Python) 본문
✏️ 문제
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