코딩 테스트

[python에서 priority queue 자료구조 사용하기 / heapq]

sping2 2025. 2. 3. 22:26

코딩 문제 하나를 풀었는데, 문제 풀이의 핵심이 '가지고 있는 값들 중에 가장 큰 값 두 개를 반복적으로 꺼내는 것'이였다. 이 문제를 풀려면 priority queue 자료구조를 사용하는 것이 효과적이라고 판단했다. 파이썬에서는 priority queue를 heapq로 편하게 사용할 수 있다. 그래서 오늘은 이 heapq에 대해 공부해봤다.



1. 먼저, priority queue를 사용해서 이 문제를 푸는 데 걸리는 시간은 O(nlogn)이다.


2. heapq를 사용하려면 먼저 import heapq를 해야 한다.


3. heapq 라이브러리의 주요 메서드
- heapq.heapify(list): 리스트를 heap으로 변환한다.
- heapq.heappop(heap): heap에서 가장 작은 원소를 pop, 리턴. 비어있는 경우는 IndexError.
- heapq.heappush(heap, item): item을 heap에 추가


4. heap의 0번 인덱스는 최솟값이다.

 

5. heapq는 기본적으로 최소 힙(min-heap)이다.

- 따라서 heappop()을 하면 가장 작은 값이 먼저 나온다.

- 만약 최대 힙(max-heap)을 만들고 싶다면 음수 값을 저장하는 방식을 써야 한다.

import heapq

nums = [1, 3, 5, 7, 9]
max_heap = [-num for num in nums]  # 모든 값에 -를 붙임
heapq.heapify(max_heap)

print(-heapq.heappop(max_heap))  # 9 (최대값)

 

6. heapq.nlargest(n, iterable)과 heapq.nsmallest(n, iterable)을 활용하면 더 쉽게 최대/최소 n개를 뽑을 수 있다.

import heapq

nums = [1, 3, 5, 7, 9, 2, 4, 6, 8]
print(heapq.nalrgest(2, nums))  # [9, 8]
print(heapq.nsmallest(2, nums))  # [1, 2]

- '가장 큰 값 두 개를 반복적으로 꺼내는 문제'에선 nlargest(2, heap)도 한 방법이 될 수 있다.

 

7. 우선순위 큐로 활용할 때 튜플을 사용할 수 있다.

- 예를 들어 (우선순위, 값) 형식으로 저장하면 자동으로 우선순위가 낮은 것부터 처리된다.

import heapq

tasks = [(2, "write code"), (1, "study"), (3, "exercise")]
heapq.heapify(tasks)

print(heapq.heappop(tasks))  # (1, "study") -> 우선순위가 가장 낮은 값이 먼저 나옴

'코딩 테스트' 카테고리의 다른 글

MST(Minimum Spanning Tree, 최소 신장 트리): 크루스칼 알고리즘  (0) 2025.02.07
그래프와 최단 거리 문제: MST & TSP  (0) 2025.02.06
스택과 큐  (0) 2023.11.19
구간 합  (1) 2023.11.18
배열과 리스트  (0) 2023.11.18