https://programmers.co.kr/learn/courses/30/lessons/92342
dfs
로 쏘지 않을때, 쏠때를 구분하여 경우의 수를 시뮬레이션 한 다음
어피치와 점수차이가 최대값이 되게 sort후 출력하는 방식으로 풀이함.
주의할점은 8,18 테스트케이스와 23번 테스트케이스인데
8,18은 제한사항에서 확인할 수 있듯이, 같은 점수차이라면
낮은 점수를 많이 맞춘 경우가 출력이 되어야하므로, 그 부분을 신경써주면된다.
나 같은 경우는 점수가 낮아질수록 높은 우선순위 점수를 부여해서 sort 조건으로 붙여주었다.
23번 테스트케이스는 라이언과 어피치가 비기는 경우이며,
점수차이가 0일때에도 [-1]
을 리턴해주도록 해주면 된다.
def solution(n, info):
answer = []
# 10,9...1,0 score
score = list(range(10,-1,-1))
# dfs함수
def dfs(n, result, total, index, apeach,priority):
# n = 화살갯수 / result = 출력리스트/ total = 내 점수
# index = 인덱스,종료조건 / apeach = 어피치 점수 / priority = 우선순위(낮은 점수일 수록 높음)
apeach_score = score[index] if info[index] else 0
if index==10: # 종료조건
# answer 리스트에 저장 ( +[n] 은 남은 화살 다쏘기)
answer.append([total-apeach,result+[n],priority])
return
elif n == 0: # 화살이 없을때 (리스트 뒤에 0 채워주기 위함)
dfs(n, result+[0], total, index+1, apeach+apeach_score,priority)
else:
for i in range(2): # 두가지 경우의 수 : 쏘지 않고 넘길때, 쏠 때
ryan = info[index]+1
if i == 0 or n < ryan: # 쏘지 않고 넘길때
dfs(n, result+[0],total,index+1,apeach+apeach_score, priority)
else:
# 어피치보다 한발 더 쏘는경우
# result list에 ryan변수만큼 추가, 점수추가, 우선순위점수 추가
# 화살 갯수 감소 ( n - ryan )
dfs(n-ryan,result+[ryan],total+score[index],index+1,
apeach, priority+score[10-index])
# dfs 실행
dfs(n, [], 0, 0, 0, 0)
# 점수차이와 우선순위 기준으로 sort, 점수차이와 우선순위는 클 수록 좋으므로 뒤집어줌
answer.sort(key=lambda x: [x[0],x[2]], reverse = True)
# 점수차가 나지않는경우(이길수 없는경우) -1 리턴
if answer[0][0] <= 0:
return [-1]
else:
# 내가 이긴 경우
# result list 리턴
return answer[0][1]
뭔가 코드가 정리가 안된느낌이지만 어디서부터 정리해야될지 몰라 일단 올림..