Ch.4 스택과 큐
우선순위 큐(Heap)
응급실에서는 먼저 온 사람이 먼저가 아닙니다
응급실은 위급한 환자가 먼저 치료받습니다. 이처럼 '우선순위'에 따라 순서가 정해지는 것이 우선순위 큐이며, 그 내부 구현이 바로 힙(Heap)입니다.
정렬하면 O(n log n)인데, 매번 정렬하지 않고 최솟값을 O(log n)에 꺼낼 수 있을까?
이진 힙(Binary Heap)은 '부모 ≤ 자식' 규칙으로 최솟값을 항상 루트에 유지합니다.
핵심 개념
힙(Heap)
부모 노드가 자식보다 항상 작은(또는 큰) 완전 이진 트리
우선순위 큐
우선순위가 높은 원소를 먼저 꺼내는 자료구조
핵심 내용
힙(Heap) = 완전 이진 트리 + 부모 ≤ 자식 (Min Heap)
Min Heap 규칙 루트 = 전체에서 가장 작은 값 부모 ≤ 왼쪽 자식 부모 ≤ 오른쪽 자식 완전 이진 트리 (왼쪽부터 채움)
Python의 heapq 모듈은 Min Heap을 제공합니다
import heapq
# 빈 리스트에 원소 추가 (heappush)
heap = []
heapq.heappush(heap, 30)
heapq.heappush(heap, 10)
heapq.heappush(heap, 20)
print(heap) # [10, 30, 20]
# 최솟값 꺼내기 (heappop)
smallest = heapq.heappop(heap)
print(smallest) # 10
print(heap) # [20, 30]
# 최솟값 확인만 (제거X)
print(heap[0]) # 20heapq는 Min Heap만 지원 Max Heap은 부호를 뒤집어 구현합니다
import heapq
# Max Heap: 음수로 넣고, 꺼낼 때 부호 복원
max_heap = []
heapq.heappush(max_heap, -30)
heapq.heappush(max_heap, -10)
heapq.heappush(max_heap, -20)
largest = -heapq.heappop(max_heap)
print(largest) # 30이 트릭은 면접에서 정말 자주 쓰입니다 반드시 외워두세요!
배열에서 K번째로 큰 원소를 찾아라 LeetCode #215 — 면접 단골 문제!
import heapq
def findKthLargest(nums, k):
# 크기 k의 Min Heap 유지
min_heap = nums[:k]
heapq.heapify(min_heap)
for num in nums[k:]:
if num > min_heap[0]:
heapq.heapreplace(min_heap, num)
return min_heap[0]
print(findKthLargest([3,2,1,5,6,4], 2)) # 5왜 Min Heap으로 Kth Largest를 찾나? k개짜리 Min Heap을 유지하면 → heap[0] = k개 중 최솟값 = 전체에서 k번째로 큰 값 시간: O(n log k) 공간: O(k)
heapq.heappop()의 시간복잡도는?
Python heapq로 Max Heap을 만들려면 원소에 ___를 곱해서 넣는다
원소 × ___ → heappush
heapq.heapify()의 시간복잡도는 O(n log n)이다
힙 마스터!
핵심 용어
힙(Heap)
부모 ≤ 자식인 완전 이진 트리
우선순위 큐
우선순위 높은 원소를 먼저 꺼내는 ADT
heappush(heap, x)
O(log n) — 삽입 후 위로 올림
heappop(heap)
O(log n) — 루트 제거 후 재정렬
heap[0]
O(1) — 최솟값 확인
heapify(list)
O(n) — 리스트를 힙으로 변환
정리 노트
우선순위 큐(Heap)
heapq 핵심 연산
- heappush
- O(log n) — 삽입
- heappop
- O(log n) — 최솟값 제거
- heap[0]
- O(1) — 최솟값 확인
- heapify
- O(n) — 리스트를 힙으로 변환
면접 패턴
- Max Heap
- -1을 곱해서 넣고, 꺼낼 때 부호 복원
- Kth Largest
- 크기 k의 Min Heap 유지 → heap[0]이 답
heapify는 O(n)이고, n번 heappush는 O(n log n) — 차이를 설명할 수 있어야 합니다!
시각 자료
핵심 정리
- 1힙 = 부모 ≤ 자식인 완전 이진 트리
- 2heapq: push/pop O(log n), heapify O(n)
- 3Max Heap은 -1 곱하기 트릭으로 구현
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작