[프로그래머스] 디펜스 게임

최동혁·2022년 12월 9일
0

프로그래머스

목록 보기
18/68

풀이 방법

  1. 일단 enemy 배열을 돌면서 k를 생각하지 않고 n으로만 계속 디펜스 한다.
    1.1 막으면서 막은 수는 heap에 넣어준다. (최대 힙)
    1.2 최대 힙으로 넣는 이유는 n값이 전부 동나서 k없이 막을 수 없을 경우 지금까지 막아온 최댓값과 현재 막아야 하는 enemy의 수를 비교하기 위해서이다.
  2. 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)
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글