큐와 덱이란?
큐(queue) 는 먼저 넣은 것이 먼저 나오는 자료구조입니다. 이 규칙을
FIFO(First In First Out)라고 합니다. 줄 서기를 떠올리면 정확합니다 — 먼저 온
사람이 먼저 처리됩니다. 스택의 LIFO와 정반대입니다.
덱(deque, double-ended queue) 은 양쪽 끝 모두에서 넣고 뺄 수 있는 큐입니다.
큐와 스택을 모두 포함하는 더 일반적인 구조입니다.
1. 기본 연산
큐의 연산:
- push(enqueue) — 뒤에 넣는다.
- pop(dequeue) — 앞에서 뺀다.
- front — 맨 앞을 본다.
덱은 여기에 앞에도 넣고 뒤에서도 빼는 연산이 추가됩니다. 모든 연산이 \(O(1)\).
2. 큐가 푸는 문제: 순서대로 처리
큐의 핵심 용도는 들어온 순서대로 공정하게 처리하는 것입니다.
- BFS(너비 우선 탐색): 가까운 정점부터 차례로 방문 — 큐가 핵심 부품.
- 시뮬레이션: 요청을 들어온 순서대로 처리, 작업 대기열.
- 회전 시뮬레이션: 앞에서 빼서 뒤에 넣으면 줄을 한 칸 돌리는 효과.
특히 BFS에서 큐가 왜 필요한지가 중요합니다. "거리 1인 정점들을 다 보고 나서야
거리 2인 정점을 본다"는 순서를 큐의 FIFO가 자동으로 보장하기 때문입니다.
3. 덱이 푸는 문제: 양쪽이 필요할 때
덱은 양쪽에서 조작이 필요한 상황에서 씁니다.
- 0-1 BFS: 가중치가 0이면 앞에, 1이면 뒤에 넣어 다익스트라 없이 최단 경로.
- 슬라이딩 윈도우 최댓값: 창이 움직일 때 양 끝에서 후보를 넣고 빼는
모노톤 덱. - 회문·양방향 탐색: 앞뒤를 동시에 다뤄야 할 때.
4. 원형 큐: 메모리를 아끼는 구현
배열로 큐를 만들 때 앞에서 계속 빼면 앞쪽 공간이 버려집니다. 원형 큐(circular
queue) 는 인덱스가 끝에 닿으면 처음으로 돌아가게 해 공간을 재활용합니다.
[ _ _ C D E ] front=2, rear=0 (E 다음은 0번 칸)
(인덱스 + 1) % 크기로 회전시키는 것이 핵심입니다. 라이브러리를 쓰면 신경 쓸
필요 없지만, 원리를 알면 메모리 제한이 빡빡할 때 유용합니다.
5. 복잡도
큐와 덱의 모든 기본 연산은 \(O(1)\)입니다. \(N\)개의 원소를 한 번씩 넣고 빼는
BFS는 \(O(N + E)\)(정점 + 간선)이 됩니다. "들어온 순서대로", "가까운 것부터"가
보이면 큐를 떠올리세요.
정리
큐는 FIFO, 덱은 양쪽 끝 자유. 큐는 BFS와 순서 처리의 부품이고, 덱은 슬라이딩
윈도우와 0-1 BFS처럼 양쪽 조작이 필요할 때 쓰입니다.