

내일 시험인데 친구가 술을 먹자고 하네요?
네… 교수님, 죄송합니다. 전 술을 마시러 갑니다.
우선순위 큐 역시 우선순위가 높은 데이터부터 꺼내는 자료구조입니다.




heapq 모듈heapq.heappush(리스트, 값)으로 리스트에 값을 인큐heapq.heappop(리스트)로 리스트의 가장 작은 값을 디큐heapq 모듈은 최소 힙 기반리스트[0]heappush나 heappop을 사용한 리스트에 .append(), .pop() 등 기존 리스트 메서드를 사용하면, 리스트의 힙 구조가 깨져 정상적으로 작동하지 않음import heapq
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 5)
print(heap[0]) # 1
print(heapq.heappop(heap)) # 1
print(heapq.heappop(heap)) # 3
print(heapq.heappop(heap)) # 5
heapq.heappush로 값에 -를 붙이고, heapq.heappop의 반환값에 다시 -를 붙이면 구현 가능import heapq
def max_heappush(heap, x):
heapq.heappush(heap, -x)
def max_heappop(heap):
return -heapq.heappop(heap)
heap = []
max_heappush(heap, 3) # 실제론 -3 푸시
max_heappush(heap, 1) # 실제론 -1 푸시
max_heappush(heap, 5) # 실제론 -5 푸시
print(heapq.heappop(heap)) # -(-5) = 5
print(heapq.heappop(heap)) # -(-3) = 3
print(heapq.heappop(heap)) # -(-3) = 1
heapq.heappush()로 값을 추가한 리스트가 아닌, 기존의 리스트의 경우 바로 heapq.heappop()을 사용할 수 없음heapq.heapify()로 리스트가 최소 힙 구조를 만족하게 변환한 뒤, heappush(), heappop()을 정상적으로 사용 가능import heapq
a = [9, 5, 2, 7]
# heappop을 바로 사용하면 안 됨
print(heapq.heappop(a)) # 9 (가장 작은 값이 아님!!)
b = [9, 5, 2, 7]
# heapq.heapify를 이용해, 최소 힙 구조로 바꿔야 함
heapq.heapify(b)
print(heapq.heappop(b)) # 2

heapq.heapify()의 시간 복잡도는 heappush하면, 기본적으로 튜플의 첫번째 원소 기준으로 정렬됨(우선순위, 값)의 형태로 인큐 및 디큐할 수 있음import heapq
schedule = []
heapq.heappush(schedule, (4, "시험공부 하기"))
heapq.heappush(schedule, (1, "아이브 컴백 기념 뮤비 보기"))
heapq.heappush(schedule, (3, "한숨 자고 오기"))
heapq.heappush(schedule, (2, "배고프니 치킨 시켜먹기"))
print("<< 오늘의 일처리 순서 >>")
while schedule:
print(heapq.heappop(schedule)[1])
# << 오늘의 일처리 순서 >>
# 아이브 컴백 기념 뮤비 보기
# 배고프니 치킨 시켜먹기
# 한숨 자고 오기
# 시험공부 하기
import heapq
def heapsort(array):
result = []
# 기존 리스트를 최소 힙으로 변경
heapq.heapify(array)
# 모든 원소를 차례대로 디큐
while array:
result.append(heapq.heappop(array))
return result
array = [17, 4, 8, 9, 6]
print(heapsort(array)) # [4, 6, 8, 9, 17]
heapify) + (번 heappop) =