[Python/백준] 1012 보석 도둑

Kanto(칸토)·2023년 8월 19일
0

알고리즘 인터뷰

목록 보기
11/30

반례찾기가 어려웠던 문제..
가장 마지막 줄에서

    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)
profile
통계학으로 사람들의 행동을 이해하고 싶습니다.

0개의 댓글

관련 채용 정보