풀이 방법
- 일단 enemy 배열을 돌면서 k를 생각하지 않고 n으로만 계속 디펜스 한다.
1.1 막으면서 막은 수는 heap에 넣어준다. (최대 힙)
1.2 최대 힙으로 넣는 이유는 n값이 전부 동나서 k없이 막을 수 없을 경우 지금까지 막아온 최댓값과 현재 막아야 하는 enemy의 수를 비교하기 위해서이다.
- n값이 동나면 k가 남아있는지 체크해서 남아있다면 힙에 넣었던 수 중 가장 큰 수를 뽑고, 현재 막아야 하는 수를 비교해 가장 큰 수를 k를 이용해서 막고, 나머지 남은 값은 n에 더해준다.
(여기서 heap에 있는 수 들은 k를 사용하지 않고 n만을 이용해서 막아낸 수들이다)
2.1 예를 들면 현재까지 7, 5, 4 명을 막고 k로 막는다고 쳐보자.
2.2 남은 n은 2이고, 이제 막아야 할 enemy는 8명이다.
2.3 그렇다면 현재까지 막아온 수 중 가장 큰수가 7명이고 enemy는 8명이기 때문에 8명일때 k를 이용하는게 효율적이다.
2.4 heap에서 뽑았던 수 7명은 다시 heap에 넣어준다.
2.4 8명은 k로 막기 때문에 heap에 넣지 않고 k만 깎는다.
2.5 만약 현재 막아온 수 중 가장 큰 수가 enemy보다 크거나 같다면, heap에서 뽑아낸 수를 k를 이용해서 막는게 더 효율적이다.
2.6 그렇기 때문에 앞에서 그 수를 n에서 빼서 막았지만, 다시 그 수만큼 더해주고 enemy를 n을 이용해서 막아준다.
2.7 그렇다면 현재 enemy[i]는 k를 이용해서 막은것이 아니기 때문에 heap에 넣어준다. 물론 k는 깎아준다.
풀이 코드
import heapq
def solution(n, k, enemy):
heap = []
if len(enemy) == k:
return len(enemy)
for i in range(len(enemy)):
if n >= enemy[i]:
heapq.heappush(heap, -enemy[i])
n -= enemy[i]
else:
if k > 0:
if heap:
a = -heapq.heappop(heap)
k -= 1
if a > enemy[i]:
n += a - enemy[i]
heapq.heappush(heap, -enemy[i])
elif a == enemy[i]:
heapq.heappush(heap, -enemy[i])
else:
heapq.heappush(heap, -a)
else:
k -= 1
else:
return i
return len(enemy)