문제
정답 소스코드 (Python)
from itertools import permutations
n=int(input())
baseball=list(permutations([1,2,3,4,5,6,7,8,9],3))
num,s_len,b_len="",0,0
for _ in range(n):
num,s_len,b_len=input().split()
s_len,b_len=int(s_len),int(b_len)
delete=[]
for i in range(len(baseball)):
s,b=0,0
for j in range(3):
if int(num[j]) in baseball[i]:
if baseball[i][j]==int(num[j]):s+=1
else:b+=1
if s!=s_len or b!=b_len:delete.append(baseball[i])
for ele in delete:baseball.remove(ele)
print(len(baseball))
풀이 (Python)
브루트 포스 실버 문제중에 가장 고전했던 문제중 하나이다.
브루트 포스문제의 기본 로직 "모든 경우의 수 검사"를 다시 한번 인지를 한뒤에 풀어야 풀 수 있는 문제였다.
중복되지 않은 1부터9까지의 숫자로 3자리 수를 구성하기에 permutations로 전체배열을 생성하여서 모든 경우의 수를 체크해 보았다.
baseball=list(permutations([1,2,3,4,5,6,7,8,9],3))
Point 1) 가정하여 풀이보다 매 경우의 수의 strike와 ball을 체크하자.
- 값 제거
delete=[]
#…………………
for ele in delete:baseball.remove(ele)
각 줄의 입력마다 for문안에서 위의 baseball리스트에서 지워야 할 strike와 ball이 맞지 않는 케이스를 추려보았다.
해당 케이스를 바로 지우지 않고, delete라는 다른 리스트에 넣고 한 이유는 조건검사와 동시에 리스트의 삭제가 일어나는 경우 indexerror가 발생할 확률이 높기에 지워야할 값을 delete에 넣고 조건 검사 이후에 처리를 해주었다.
- 조건 검사 로직
for i in range(len(baseball)):
s,b=0,0
for j in range(3):
if int(num[j]) in baseball[i]:
if baseball[i][j]==int(num[j]):s+=1
else:b+=1
if s!=s_len or b!=b_len:delete.append(baseball[i])
baseball안에 가능한 중복되지 않은 1부터9까지의 숫자로 3자리 수가 존재하기에 해당 숫자가
입력값의 num과 strike, ball과 동일한지 비교를 하여 동일하지 않다면, delete리스트에 추가를 해주었다.
이후 위에서와 같이 baseball에서 delete리스트안에 있는 값이 존재한다면, 지워주었다.
'Baekjoon' 카테고리의 다른 글
[백준] 1446번 지름길 (파이썬) (1) | 2024.01.28 |
---|---|
[백준] 2631번 줄 세우기 (파이썬) (1) | 2024.01.28 |
[백준] 10974번 모든 순열 (파이썬) (1) | 2024.01.28 |
[백준] 2309번 일곱 난쟁이 (파이썬) (1) | 2024.01.23 |
[백준] 4485번 녹색 옷 입은 애가 젤다지? (파이썬) (0) | 2024.01.23 |