heapq 모듈은 이진 트리(binary tree) 기반의 최소 힙(min heap) 자료구조를 제공한다.
min heap 을 사용하면 원소들이 항상 정렬된 상태로 추가되고 삭제되며, min heap 에서 가장 작은 값은 언제나 인덱스 0, 즉 이진트리의 루트에 위치한다. 내부적으로 min heap 내의 모든 원소(k) 는 항상 자식 원소들(2k+1, 2k+2) 보다 크기가 작거나 같도록 원소가 추가되고 삭제된다.
heapq 모듈은 파이썬의 일반 리스트를 최소 힙처럼 다룰 수 있도록 도와준다. 따라서 빈 리스트를 생성하고 heapq 모듈의 함수를 호출할 때마다 이 리스트를 인자로 넘겨야한다.
import heapq
heap = []
# 힙에 원소 추가
heapq.heappush(heap, 4)
heapq.heappush(heap, 1)
heapq.heappush(heap, 7)
heapq.heappush(heap, 3)
# 가장 작은 원소를 삭제
heapq.heappop(heap)
# 기존 리트스를 힙으로 변환
num = [4, 1, 7, 3, 8, 5]
heapq.heapify(num)
[백준] 강의실 배정 (https://www.acmicpc.net/problem/11000)
import heapq
N = int(input())
class_list = [list(map(int, input().split())) for _ in range(N)]
class_list.sort() # 꼭 정렬해야함
room = []
heapq.heappush(room, class_list[0][1])
for idx in range(1,N):
if class_list[idx][0] < room[0]:
heapq.heappush(room, class_list[idx][1])
else: # 수업 끝나고 이어서 하면 됨
heapq.heappop(room)
heapq.heappush(room, class_list[idx][1])
print(len(room))