상덕이가 훔칠 수 있는 보석의 최대 가격을 구하라
입력
일단 당장 생각나는 알고리즘은 동적계획법의 배낭문제를 적용하는 것이다. 근데 기존 배낭 문제와의 차이점은 기존 문제는 하나의 가방에 가격을 최대로 하도록 보석을 여러개 집어 넣는 거지만 이번 문제는 각 가방에 하나씩 넣는 거라 쉬울 수 있으면서 어려울 수 있다.
만약 보석의 가치를 최대로 하려면 보석의 가격을 기준으로 리스트를 정렬하고 가방의 무게에도 우선순위를 넣어 거기에 맞춰서 넣으면 될 것 같다. 그리디 알고리즘도 한번 사용해보자.
import heapq
N, K = map(int, input().split())
jewelry = []
for _ in range(N):
M, V = map(int, input().split())
heapq.heappush(jewelry, [M, V])
bag = []
for _ in range(K):
C = int(input())
heapq.heappush(bag, C)
answer = 0
enable_jewelry = []
for _ in range(K):
c = heapq.heappop(bag)
while jewelry and c >= jewelry[0][0]:
[w, v] = heapq.heappop(jewelry)
heapq.heappush(enable_jewelry, -v)
if enable_jewelry:
answer -= heapq.heappop(enable_jewelry)
elif not jewelry:
break
print(answer)