II. 선형 구조

4. 덱 — 앞뒤로 넣고 빼기 · 약 5분

← 전체 목차 이 단원 목차

🎮 이 단원이 게임에서 쓰이는 곳 (언더테일·RPG)

= 최근 본 아이템/방 목록, 스크롤 히스토리처럼 앞뒤로 넣고 빼는 경우에 씁니다. "뒤에만 넣고 앞에서만 뺀다"면 큐(대사 순서), "한쪽 끝에서만 넣고 뺀다"면 스택(메뉴 뒤로가기)과 같아요. RPG에서 최근 방문한 맵 5개를 덱으로 유지할 수 있어요.

덱(Deque)

Double-Ended Queue(더블 엔디드 큐)의 줄임말 덱(Deque, 덱)이에요. 앞과 뒤 둘 다 넣고 뺄 수 있는 구조예요. 스택이랑 큐를 합친 느낌입니다.

연산

활용

최근 본 목록, 스크롤 히스토리, 슬라이딩 윈도우 등 앞뒤로 자유롭게 넣고 빼는 경우에 씁니다.

😄 조크 전구 갈 때 프로그래머가 몇 명 필요해요? 영 명. 그건 하드웨어 문제니까요. 더 보기 →

🔄 유사 구조 비교: 스택 vs 큐 vs 덱

넣고 빼는 위치가 다르면 나오는 순서가 달라요. 아래 표로 차이를 비교해 보세요.

구분 스택
넣는 곳 / 빼는 곳 맨 위에만 넣고, 맨 위에서만 뺌 (한쪽 끝) 뒤에 넣고, 에서 뺌 (한쪽은 넣기, 한쪽은 빼기) 앞·뒤 둘 다 넣고 뺄 수 있음
나오는 순서 LIFO — 나중에 넣은 게 먼저 나옴 FIFO — 먼저 넣은 게 먼저 나옴 쓰는 방식에 따라 LIFO 또는 FIFO 또는 혼합
게임에서 쓰는 곳 메뉴 뒤로가기 (타이틀→메인→설정 push, 뒤로 누르면 pop) 대사·이벤트 순서 (대사 enqueue, "다음" 누르면 dequeue) 최근 본 목록, 슬라이딩 윈도우
파이썬 list: append, pop() deque: append, popleft() deque: append, appendleft, pop, popleft

📌 덱 — Python / C# / C++ 대응

연산 Python (deque) C# C++
뒤에 넣기 append(x) LinkedList AddLast 등 (표준 덱 없음) deque.push_back(x)
앞에 넣기 appendleft(x) AddFirst deque.push_front(x)
앞에서 / 뒤에서 꺼내기 popleft() / pop() RemoveFirst / RemoveLast pop_front() / pop_back()

응용 최근 본 메뉴·아이템 N개(앞에 추가, 넘치면 뒤 제거), 슬라이딩 윈도우(구간을 앞뒤로 밀 때), BFS에서 앞뒤 모두 넣는 변형이 필요할 때.

문제 및 해설

덱(Deque)은 스택과 큐를 합친 것처럼 앞·뒤 둘 다 넣고 뺄 수 있어요. "뒤에 넣고 앞에서 꺼내기"만 쓰면 어떤 구조와 같나요?
큐(Queue)와 같아요. FIFO가 돼요.

문제 및 답 확인

"앞에 넣고 앞에서 꺼내기"만 쓰면 어떤 구조와 같나요?
답 보기
스택(Stack). LIFO예요.

도전과제

풀어 본 뒤 정답을 펼쳐 확인하세요.

도전 1. 덱으로 "뒤에 1, 2 넣고 → 앞에서 하나 꺼내고 → 앞에 0 넣고 → 뒤에서 하나 꺼내기" 순서로 했을 때, 꺼낸 값 두 개는? (순서대로)
정답 보기

정답: 1, 2

뒤에 1,2 넣음 → [1, 2](앞=1, 뒤=2). 앞에서 꺼냄 → 1 나옴(첫 번째). 앞에 0 넣음 → [0, 2]. 뒤에서 꺼냄 → 2 나옴(두 번째). 따라서 꺼낸 값은 1, 2예요.

도전 2. 게임에서 "최근 본 메뉴 3개"를 기억할 때, 새 메뉴를 볼 때마다 "맨 앞에 추가"하고 3개를 넘기면 "맨 뒤를 삭제"하면 됩니다. 이때 쓰기 좋은 자료구조는?
정답 보기

정답: 덱(Deque)

앞에 appendleft로 새 메뉴 추가, 길이가 3을 넘으면 뒤에서 pop으로 오래된 것 제거. 덱은 앞·뒤 연산이 모두 O(1)이라 적합해요.

문제 및 실습

📌 이론(알고리즘) ↔ 파이썬 함수

큐 연산 (덱으로 구현) enqueue → deque.append(값)  |  dequeue → deque.popleft()

대응 덱은 "앞·뒤 모두 넣고 뺄 수 있는" 구조예요. 파이썬에서는 collections.deque로 큐·덱 연산을 둘 다 씁니다.

from collections import deque / deque(리스트)
앞·뒤에서 O(1)로 넣고 뺄 수 있는 deque. 큐처럼 "뒤에 넣고 앞에서 뺄 때" 쓰기 좋아요.
덱.append(값)
에 넣기 → enqueue에 대응해요.
덱.popleft()
에서 하나 꺼내서 반환 → dequeue에 대응해요. "left"는 앞쪽을 의미해요.

왜 list가 아니라 deque인가요? 리스트의 pop(0)은 비용이 커요. deque는 맨 앞·맨 뒤만 다루도록 구현돼 있어서 덱/큐 연산에 맞습니다.

🐍 파이썬으로 실습 (이 페이지 안에서)

위 실습은 이 강의(덱/큐)에서 배운 append·popleft를 쓰는 예제입니다. 손으로 해보려면 실습: 덱 (손으로 하기).

II단원 심화 실습 (4단계) — 이 페이지 안에서

아래는 이 단원(스택·큐)을 게임에 쓰는 방식으로 확장하는 실습이에요. 페이지 이동 없이 여기서 진행하면 됩니다.

  1. 1단계 스택: 메뉴 화면 이름을 append로 쌓고, pop으로 "뒤로" 할 때마다 꺼내 보기.
  2. 2단계 큐: 대사 줄을 append로 넣고, popleft()로 순서대로 꺼내 보기.
  3. 3단계 스택+큐를 각각 변수로 두고, "메뉴 들어가기 / 대사 다음"을 print로 시뮬레이션.
  4. 4단계 push/pop 순서를 코드로 써서 "들어가기·뒤로가기"가 스택에 어떻게 쌓이는지 확인.
🐍 심화: 스택 (메뉴 히스토리)
🐍 심화: 큐 (대사 순서)