https://school.programmers.co.kr/learn/courses/30/lessons/92342
개인적으로 lv2보다는lv3 보이는 문제
from collections import defaultdict
def solution(n, info):
global ryan, answer, mx
ryan = [0]* len(info)
answer = defaultdict(list)
mx = 0
def do_score(ryan, info):
ryan_score = 0
apeach_score = 0
for i in range(11):
if ryan[i] == 0 and info[i] == 0:
continue
elif ryan[i]>info[i]:
ryan_score += 10-i
else:
apeach_score += 10-i
if ryan_score > apeach_score:
return ryan_score - apeach_score
return 0
def dfs(idx,n):
global mx
if n <= 0: # 가지치기
ryan_result = do_score(ryan,info)
if ryan_result:
mx = max(mx, ryan_result)
answer[ryan_result].append(ryan[:])
return
if idx == 10:
if n > 0:
ryan[idx] += n
ryan_result = do_score(ryan,info)
if ryan_result:
mx = max(mx, ryan_result)
answer[ryan_result].append(ryan[:])
if n >0:
ryan[idx] -= n
return
winning=min(info[idx]+1,n)
ryan[idx] += winning
dfs(idx+1, n-winning)
ryan[idx] -= winning
dfs(idx+1, n)
dfs(0,n)
par = answer[mx]
return sorted(par, key = lambda x : x[::-1], reverse=True)[0] if par else [-1]
세 가지 중요한 포인트를 기록한다.
for r, i in zip(ryan, info)
로 잡은 뒤에 점차로 10에서부터 1까지 스코어를 줄여가면서 기록하는 것을 for 문에서 aim= 10 으로 시작한뒤 if문 가장 아래에서 aim-=1을 반복해주는 구조로 짰었는데, continue 조건을 만난 경우 aim -=1을 수행할 수 없었기 때문에 문제가 발생했다. (디버깅하는데 엄청 오래걸렸다. for문의 구조를 range로 짠 것이 아니라 zip으로 짠 것이 실수였다.)sorted(par)[0]
으로 해서는 안되고 sorted(par, key = lambda x : x[::-1], reverse=True)[0]
이렇게 해야 한다는 것이었다. 8번 18번 테케에서 틀렸는데 반례를 찾아볼 수 있을 것 같다.n
을 더해주는 부분을 원복 시키지 못해서 문제가 발생했다. solution 에서 처리된 것이 아니라 기저사례(base case)에서 처리해버리는 바람에 파악하지 못했다. (디버깅 오래걸림) 더 깔끔한 처리 방법 -> array 자체에 변경을 가하지 말고 답안에만 반영해 넣어두기! ryan[idx] += winning
dfs(idx+1, n-winning)
ryan[idx] -= winning
dfs(idx+1, n)
pythonic 한 답안 : 말도 안되게 편함.