이 문제 푸는 것만 두시간 내내 걸렸다... 어려워...ㅠㅜㅠㅜ흑흑 능력은 찬찬히 늘려 가는게 중요하지.. ㅠㅠ
import itertools
def solution(baseball):
answer = 0
# 그냥 1부터 9까지 다 돌리면
pool = ['1', '2', '3','4','5','6','7','8','9']
num_list = list(map(''.join, itertools.permutations(pool, 3)))
for i in baseball :
for j in num_list[:]:
if not(sb(j,i)):
num_list.remove(j)
print(len(num_list))
return len(num_list)
우선 위의 코드는 먼저 num_list라고 숫자 3개로 만들 수 있는 모든 조합을 만들어 준다.
이전에 풀면서 알았던거 바로 써먹자,
사실 여기 까지 생각하는 과정 자체가 어려웠다.. 처음에는 검사를 통해서 순열을 하나씩 만들어 갈까도 했는데,
이렇게 소거로 푸는게 훨씬 낫고 확인도 확실한 것 같다.
그렇게 만들어진 순열이 기존의 baseball 리스트의 조건에 해당하는지를 검사한 후 조건에 맞으면 제거하지 않고,
조건과 다름녀 num_list.remove(j)로 삭제한다.
그런데 여기에서 중요한 것이 for j in num_list[:]: 이다. 여기 부분에서 에러가 나서 또 한참 걸렸는데, 그냥 num_list를 쓸 경우 for 문이 list의 숫자로 세기 때문에 건너뛰는 수들이 생긴다. 그렇기 때문에 기존의 값을 유지하면서
for문을 돌아야 하므로 필수적으로 num_list에 [:]를 붙여야 한다.
이런 식으로 풀면 된다.
밑의 코드는 스트라이크와 볼의 조건을 검사하는 함수이다.
def sb(number,i):
n = list(number)
o = list(str(i[0]))
s,b = 0,0
for x in range(3):
if n[x] == o[x]:
s+=1
elif o[x] in n:
b+=1
if s== i[1] and b==i[2]:
return True
return False
조건에 부합하는 값이라면 True , 조건과 부합하지 않는다면 False를 리턴하므로 이후 검사에 사용된다.
돌면서 s값에는 strike와 b값에는 ball을 넣고 이 두 값 모두 주어진 i안의 값과 동일할 경우만 True를 리턴하여 값을 지우지 않게 된다.
막상 한번 알게되면 짜는데 그렇게 시간이 걸리지는 않으나 생각을 해내고 어떻게 하는지를 아는 과정이 중요하다..
'코딩테스트 연습 > 프로그래머스' 카테고리의 다른 글
[ 프로그래머스 ] level 2 큰 수 만들기 - 파이썬 (0) | 2019.12.16 |
---|---|
[ 프로그래머스 ] 구명 보트 - level 2 ( 파이썬 ) (0) | 2019.12.13 |
[프로그래머스/코딩테스트 연습] 완전탐색 소수 찾기 (0) | 2019.12.10 |
[프로그래머스/코딩테스트 연습] 괄호 변환 (0) | 2019.12.09 |
[프로그래머스/코딩테스트 연습] [3차] 파일명 정리 (0) | 2019.12.03 |