잘 생각해보면, 현재까지의 stage중 가장 enemy가 많았던 k개에 무적권을 쓰는 것이 항상 가장 최선의 전략임을 알 수 있다. 따라서 그리디하게 가장 많은 enemy를 저장하며 문제를 풀이하면 된다. 이 경우 priority queue, heap를 쓰는 게 좋다.
즉 주요 알고리즘은 다음과 같이 나타낼 수 있다.
1. stage 개수보다 무적권의 개수 k가 같거나 더 많다면 모든 경우에 무적권을 사용할 수 있으므로, stage의 길이를 반환한다.
2. priority queue에 초반 k의 enemy를 저장한다.
3. k를 넘어선다면, i번째 stage의 enemy[i-1]를 priority queue에 저장하고, 하나를 pop한다. 그리고 그 pop한 enemy를 남은 병사 수 n에서 차감한다. 만약 차감하는 데 실패한다면(즉 차가 0보다 작아진다면) 최선의 경우에도 더 이상 게임을 진행하는 것이 불가능하므로, i-1를 리턴한다.
풀이 코드
from heapq import heappush, heappop
def solution(n, k, enemy):
stage = len(enemy)
if k >= stage :
return stage
q = []
for i in range(stage) :
heappush(q, enemy[i])
if len(q) > k :
last = heappop(q)
if last > n :
return i
n -= last
return stage