PS/코드트리

[그리디] Greedy Algorithm / 폭탄 해체 작업

행복한라이언 2024. 2. 15. 21:04
728x90
반응형

문제링크

https://www.codetree.ai/missions/8/problems/the-bomb-dismantling?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

1. 핵심

  • 핵심: 시간제한이 감소하는 순으로 보며 해당 시간에 선택할 수 있는 폭탄 중 점수가 가장 높은 폭탄을 선택하는 것이 최선이다!
  • 예시
    • 시간제한이 가장 긴 것부터 선택했을 때 가장 최대 이익을 얻을 수 있다.
    • 만약 time 1 때 9를 선택하면 다른 폭탄 8과 2는 선택할 수 없기 때문에 이익이 작아진다.
시간 1 2 3 4 5 6
터질 수 있는
폭탄의 후보
9 9 9 9 9 9
'' 8 8 8 8 8 8
'' 7 7 7 7 7  
'' 6          
'' 2          
  • 따라서 우리는 가장 늦은 시간부터 앞으로 오면서 이익이 가장 큰 폭탄들을 시간마다 선택하면 된다.
  • 문제는 time 6때 9를 선택하면 다음은 time 5때는 8을 선택해야한다.
    • 그러면 9를 뽑고 나서 8도 저장을 하고 time 5 때 8을 뽑을 수 있어야한다. 즉 각 타임당 점수의 후보들을 저장해놓고 가장 큰 것부터 가져와서 시간에 점수를 배분해야한다. 
  • 가장 큰 값을 먼저 뽑도록 만들기 위해서 max heap를 사용한다.

2. 코드(Python)

from heapq import heappush, heappop

t = int(input())
bombs = [list(map(int, input().split())) for _ in range(t)]
bombs.sort(key= lambda x: (x[1], x[0]))
MAX_TIME = bombs[-1][-1]

bomb_list = [[] for _ in range(MAX_TIME + 1)]
for score, limit in bombs:
    bomb_list[limit].append(score)

heap = []
cnt = 0
for time in range(MAX_TIME, 0, -1):
    for score in bomb_list[time]:
        heappush(heap, -score)
    if len(heap) == 0:
        continue
    q = -heappop(heap)
    cnt += q
    
print(cnt)

 

 

728x90
반응형