우선순위 큐란?
우선순위 큐(priority queue) 는 들어온 순서가 아니라 우선순위가 가장 높은
원소가 먼저 나오는 자료구조입니다. 보통 "가장 큰 값" 또는 "가장 작은 값"을
꺼내는 용도로 씁니다.
일반 큐는 FIFO지만, 우선순위 큐는 "가장 중요한 것 먼저"입니다. 응급실에서
도착 순서가 아니라 위급한 환자부터 보는 것과 같습니다.
1. 무엇을 빠르게 해 주나
우선순위 큐의 핵심 연산과 복잡도:
- 삽입(push): \(O(\log N)\)
- 최댓값/최솟값 꺼내기(pop): \(O(\log N)\)
- 최댓값/최솟값 보기(top): \(O(1)\)
정렬 배열에서 매번 최솟값을 꺼내려면 \(O(N)\)이 들지만, 우선순위 큐는 삽입과
삭제를 모두 \(O(\log N)\)에 처리합니다. 동적으로 값이 들어오고 나가며 매번
극값이 필요할 때 최적입니다.
2. 내부 구조: 힙
우선순위 큐는 보통 힙(heap) 이라는 완전 이진 트리로 구현됩니다.
- 최대 힙: 모든 부모가 자식보다 크거나 같다 → 루트가 최댓값.
- 최소 힙: 모든 부모가 자식보다 작거나 같다 → 루트가 최솟값.
배열 하나로 트리를 표현합니다 — 인덱스 \(i\)의 자식은 \(2i+1, 2i+2\), 부모는
\((i-1)/2\). 삽입·삭제 후 부모-자식 관계를 만족하도록 위/아래로 값을 교환
(sift)하며, 트리 높이가 \(\log N\)이라 각 연산이 \(O(\log N)\)입니다.
3. 무엇을 못 하나
우선순위 큐는 극값만 빠르게 줍니다. 다음은 못 합니다.
- 임의 원소 검색/삭제(특정 값 찾기) — 지원 안 함.
- 정렬된 전체 순회 — 하나씩 꺼내면 정렬이 되지만 그땐 구조가 비워집니다.
- "k번째로 큰 값" 직접 조회 — 별도 기법 필요.
"가장 크거나 작은 것 하나"만 반복해서 필요할 때 쓰는 도구임을 기억하세요.
4. 대표 활용
| 문제 | 우선순위 큐의 역할 |
|---|---|
| 다익스트라 최단 경로 | 가장 가까운 정점을 매번 꺼냄 |
| 작업 스케줄링 | 우선순위 높은 작업부터 |
| K개 병합 정렬 | 각 줄의 맨 앞 중 최솟값 |
| 중앙값 유지 | 최대 힙 + 최소 힙 |
| 힙 정렬 | 전부 넣고 하나씩 꺼냄 → \(O(N \log N)\) |
특히 다익스트라에서 우선순위 큐가 핵심 부품이라, Gold 단계로 가는 다리가
됩니다.
5. 힙 정렬로 보는 정당성
모든 원소를 힙에 넣고(\(O(N \log N)\)) 하나씩 꺼내면 정렬된 순서로 나옵니다. 이것이
힙 정렬이며, 우선순위 큐가 "매번 정확히 극값을 준다"는 보장을 확인시켜
줍니다.
정리
우선순위 큐는 힙으로 구현되어, 삽입·극값 삭제를 \(O(\log N)\)에 처리합니다.
"동적으로 들어오고 나가는 값 중 매번 최대/최소가 필요"하면 우선순위 큐입니다.
다익스트라·스케줄링·중앙값 유지의 핵심 부품입니다. 다음 강의에서 코드로 익힙니다.