링크 : https://www.acmicpc.net/problem/2503
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트
www.acmicpc.net
- 문제
- 소요시간:30분(실패)
- 설계하기(접근방법)
1. 입력받기
테스트 케이스와
숫자, strike, ball을 입력받는다
2. 구현하기
처음에는 케이스별로 나누어
해당하는 숫자들의 교집합을 구하려고 했으나
구현의 어려움을 느꼈다
따라서 다른 블로그의 풀이를 참조했다
실제로 100~ 987까지의 케이스를 모두 순회하면서
테스트 케이스로 주어진 숫자의
strike, ball과 매치하지 않는
숫자들을 모두 제거하는 방식으로 풀었다
즉 123이 3볼이었다면
123 은 3스트라이크기 때문에 제거
124는 2스트라이크기 때문에 제거
...
312는 3볼이기 때문에 유지
...
식으로 제거해나가면
리스트에는 정답 가능성이 있는 숫자만 남게 된다
3. 출력하기
남은 숫자의 개수를 출력한다
- 코드(출력)
from itertools import permutations
n = int(input())
number_list = [str(i) for i in range(1,10)]
all = list(permutations(number_list, 3))
for i in range(n):
guess, strike ,ball = map(int, input().split())
guess = list(str(guess))
remove_cnt = 0
for i in range(len(all)):
s, b = 0, 0
i -= remove_cnt
for j in range(3):
if all[i][j] == guess[j]:
s += 1
elif guess[j] in all[i]:
b += 1
if s != strike or b != ball:
all.remove(all[i])
remove_cnt += 1
print(len(all))
- 얻어갈 부분
1. 리스트를 순회하면서 원소를 제거하면 순서가 밀리는 상황이 발생하는데. remove_cnt를 세주면서 제거하면 가독성 좋게 코딩할 수 있다.
2. permutaions에 대해서 더 공부해보자
'알고리즘(백준) > 브루트 포스' 카테고리의 다른 글
[알고리즘/브루트 포스] 14889번 : 스타트와 링크 - python (0) | 2024.02.18 |
---|---|
[알고리즘/브루트 포스] 1182번 : 부분 수열의 합 - python (1) | 2024.01.15 |
[알고리즘/브루트 포스] 1018번 - python (1) | 2024.01.12 |
[알고리즘/브루트 포스] 1436번 : 영화감독 숌 - python (0) | 2024.01.12 |
[알고리즘/브루트 포스] 15721번 : 번데기 - python (0) | 2023.06.08 |