핵심 인사이트 (3줄 요약)
- 본질: 덱(Deque, Double-Ended Queue)은 양쪽 끝에서 삽입·삭제가 모두 가능한 자료구조다. 큐(FIFO)와 스택(LIFO)의 기능을 모두 포함하는 슈퍼셋이다.
- 가치: 슬라이딩 윈도우 최댓값/최솟값 문제에서 덱을 사용하면 O(n) 시간에 해결 가능하다(단순 배열은 O(n²)). 이중 연결 리스트 또는 순환 배열로 구현하며 모든 연산이 O(1) 분할 상환이다.
- 판단 포인트: 덱의 핵심 알고리즘 응용은 "단조 덱(Monotonic Deque)"이다. 슬라이딩 윈도우에서 최대/최솟값 조회 시 덱의 양끝 관리로 O(n) 달성. LeetCode 239번 Sliding Window Maximum이 대표 문제다.
Ⅰ. 개요 및 필요성
┌──────────────────────────────────────────────────────────┐
│ 덱 자료구조 동작 │
├──────────────────────────────────────────────────────────┤
│ │
│ 앞(Front) 삽입/삭제 ←→ 뒤(Rear) 삽입/삭제 │
│ │
│ [← A | B | C | D →] │
│ 앞(Front) 뒤(Rear) │
│ │
│ push_front(X): [X | A | B | C | D] │
│ push_back(Y): [X | A | B | C | D | Y] │
│ pop_front(): 반환 X, [A | B | C | D | Y] │
│ pop_back(): 반환 Y, [A | B | C | D] │
│ │
│ 모든 연산: O(1) (이중 연결 리스트 또는 순환 배열) │
└──────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: 덱은 양쪽에 문이 있는 버스다. 앞문·뒷문 어디서든 승객(데이터)이 탑승·하차할 수 있어 상황에 따라 큐처럼 앞뒤로 사용하거나 스택처럼 한쪽만 사용할 수 있다.
Ⅱ. 아키텍처 및 핵심 원리
단조 덱 (Monotonic Deque)
슬라이딩 윈도우 최댓값 (k=3):
배열: [1, 3, -1, -3, 5, 3, 6, 7]
창 [1,3,-1]: 덱=[3,-1], 최대=3
창 [3,-1,-3]: 덱=[3,-1,-3], 최대=3
창 [-1,-3,5]: 덱=[5], 최대=5
창 [-3,5,3]: 덱=[5,3], 최대=5
창 [5,3,6]: 덱=[6], 최대=6
창 [3,6,7]: 덱=[7], 최대=7
원리: 덱 뒤에서 현재 값보다 작은 것은 제거 (단조 감소)
창 밖으로 나간 인덱스는 앞에서 제거
구현 방식
| 구현 | 장점 | 단점 |
| 이중 연결 리스트 | O(1) 삽입·삭제 | 포인터 오버헤드 |
| 순환 배열 | 캐시 친화적 | 크기 제한 |
| Python collections.deque | 표준 라이브러리 | C 구현, 빠름 |
- 📢 섹션 요약 비유: 단조 덱은 자동으로 더 작은 값을 버리는 스마트 줄이다. 줄에 들어올 때 나보다 작은 사람은 자동으로 줄에서 빠지는 규칙 덕분에 줄에는 항상 내림차순으로만 사람이 있다.
Ⅲ. 비교 및 연결
| 비교 | 스택 | 큐 | 덱 |
| 삽입 | 한쪽 끝 | 한쪽 끝 | 양쪽 끝 |
| 삭제 | 같은 끝 | 반대 끝 | 양쪽 끝 |
| 패턴 | LIFO | FIFO | 둘 다 |
- 📢 섹션 요약 비유: 스택·큐·덱은 도로 구조다. 스택은 막힌 골목(한쪽만 출입), 큐는 일방통행 도로(한쪽 입구·반대쪽 출구), 덱은 양방향 도로(양쪽 모두 출입 가능)다.
Ⅳ. 실무 적용 및 기술사 판단
알고리즘 응용
from collections import deque
# 슬라이딩 윈도우 최댓값
def maxSlidingWindow(nums, k):
dq = deque() # 인덱스 저장
result = []
for i, num in enumerate(nums):
# 창 밖 인덱스 제거
while dq and dq[0] < i - k + 1:
dq.popleft()
# 현재보다 작은 값 제거 (단조 감소)
while dq and nums[dq[-1]] < num:
dq.pop()
dq.append(i)
if i >= k - 1:
result.append(nums[dq[0]])
return result
- 📢 섹션 요약 비유: 슬라이딩 윈도우 덱은 이동하는 창문이다. 창문(윈도우)이 오른쪽으로 이동하면서 창문 밖으로 나간 것은 버리고, 새로 들어온 것 중 최대가 아닌 것도 버려서 항상 현재 창문의 최댓값을 O(1)에 알 수 있다.
Ⅴ. 기대효과 및 결론
| 기대효과 | 내용 |
| 슬라이딩 윈도우 | O(n²) → O(n) 최적화 |
| 양방향 처리 | 큐+스택 기능 통합 |
| BFS 변형 | 우선순위 BFS, 0-1 BFS |
덱은 BFS 변형 알고리즘(0-1 BFS, 양방향 BFS)에서도 핵심 역할을 한다. 0-1 BFS에서 가중치가 0인 엣지는 덱 앞쪽에, 1인 엣지는 뒤쪽에 추가하여 다익스트라 없이 O(V+E) 최단 경로를 구현한다.
- 📢 섹션 요약 비유: 0-1 BFS + 덱은 급행·완행이 혼합된 지하철이다. 급행(가중치 0)은 맨 앞에 서고, 완행(가중치 1)은 맨 뒤에 서서 항상 가장 빠른 경로가 앞에 있도록 관리한다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
| 단조 덱 | 슬라이딩 윈도우 최적화 핵심 |
| BFS | 덱 기반 그래프 탐색 |
| 0-1 BFS | 가중치 덱 기반 최단 경로 |
| 슬라이딩 윈도우 | 덱의 핵심 알고리즘 응용 패턴 |
| 우선순위 큐 | 덱의 확장 개념 |
📈 관련 키워드 및 발전 흐름도
[스택·큐 — 단방향 자료구조]
│
▼
[덱 (Deque) — 양방향 삽입·삭제]
│
▼
[단조 덱 — 슬라이딩 윈도우 최적화]
│
▼
[0-1 BFS — 이진 가중치 최단 경로]
│
▼
[세그먼트 트리·스파스 테이블 — 구간 최솟값 고급 구조]
👶 어린이를 위한 3줄 비유 설명
- 덱은 양쪽 모두 출입 가능한 버스예요! 앞문·뒷문 어디서든 타고 내릴 수 있어요.
- 단조 덱을 쓰면 이동하는 창문 안의 최댓값을 매번 다시 계산하지 않아도 돼요 — O(n²)을 O(n)으로 줄이는 마법!
- Python의 collections.deque는 이 덱을 빠르게 구현해둔 도구로 코딩 테스트에서 자주 쓰인답니다!