heap은 '최댓값 및 최솟값을 찾아내는 연산'을 빠르게 하기 위해 고안된 완전 이진트리를 기본으로 한 자료구조
A가 B의 부모 노드이면, A의 키 값과 B의 키 값 사이에는 대소 관계가 성립함
형제 노드 사이에서는 대소 관계 정해지지 않음
부모 노드의 키 값이 자식 노드의 키 값보다 항상 작은 힙
가장 작은 값을 가지는 노드가 항상 루트에 오게 됨

부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰 힙
가장 큰 값을 가지는 노드가 항상 루트에 오게 됨

heapq 모듈은 리스트를 최소 힙 처럼 다룰 수 있도록 제공함
heapq 모듈은 기본이 최소힙 형태이기 때문에 최대힙으로 사용하기 위해서는 간단한 트릭이 필요하다.
힙에 item을 추가할 때 (-item, item) 형태의 튜플을 삽입하면 -로 인해 가장 큰 값이 가장 작은 값으로 변환되고 이는 최소힙 형태인 heapq에서 루트에 위치하게 된다.
기존 값을 pop하여 사용하고 싶을 때는 heapq.heappop(list)[1]을 통해 튜플의 두번째 값을 사용하면 된다.