반례찾기가 어려웠던 문제..
가장 마지막 줄에서
elif not jew:
break
라고 처리하는게 맞는데
if not jew:
break
if 문으로 처리하고 있었다. 그러다보니 jew 라는 리스트가 소진되기만 하면 바로 프로그램에 종료되어버려서, 아직 temp_q에 요소가 남아있는데도 나머지 가방에 집어넣지 못하는 문제가 발생하는 것이었다.
이것은 반례를 찾지 못해서 오래걸렸다. 그런 경우를 상상하기가 어려웠다.
데이터의 흐름을 손으로 추적하지 않으면 안될 그런 문제였던 것 같다.
import sys
import heapq
input = sys.stdin.readline
n, k = map(int,input().split())
jew = []
for _ in range(n):
heapq.heappush(jew, tuple(map(int, input().split())))
b = [int(input()) for _ in range(k)] # 가방무게 배열
b.sort()
answer = 0
temp_q=[] # 보석의 가치만 기록하는 q
for i in b: # 용량이 작은 가방부터
while jew and i >= jew[0][0]: #가장 앞에 있는 보석의 무게가 가방보다 작으면
a = heapq.heappop(jew)
print(a)
heapq.heappush(temp_q, (-a[1], a[1])) # 가방에 넣어둔다. 최대힙으로 사용하기 위해서 - 값으로 넣자.
if temp_q:
answer += heapq.heappop(temp_q)[1] # 가장 비싼 보석을 빼서 더한다.
elif not jew:
break
print(answer)