파이썬에서 데크(Deque, Double-Ended Queue)는 스택과 큐처럼 데이터를 저장하는 자료구조입니다. 일반적인 큐와 달리 양쪽 끝에서 모두 삽입(append)과 삭제(pop)가 가능하다는 점이 가장 큰 특징이며, 이 덕분에 스택과 큐의 기능을 하나로 모두 구현할 수 있습니다.
데크는 파이썬 표준 라이브러리인 collections 모듈을 통해 제공되며, 내부적으로 양방향 연결 리스트 기반으로 구현되어 있어 리스트(list)와 달리 양쪽 끝에서의 삽입·삭제가 O(1)의 시간 복잡도로 매우 빠릅니다.
데크의 주요 메서드
데크에서 자주 사용되는 핵심 연산은 다음과 같습니다.
append(x) — 인자로 전달한 값을 데크의 오른쪽 끝에 삽입합니다.
appendleft(x) — 인자로 전달한 값을 데크의 왼쪽 끝에 삽입합니다.
pop() — 데크의 오른쪽 끝에서 요소를 삭제하고 반환합니다.
popleft() — 데크의 왼쪽 끝에서 요소를 삭제하고 반환합니다.
extend(iterable) — 반복 가능한 객체(iterable)의 여러 값을 데크의 오른쪽 끝에 한 번에 추가합니다.
extendleft(iterable) — 반복 가능한 객체의 여러 값을 데크의 왼쪽 끝에 추가합니다. 왼쪽 방향으로 하나씩 삽입되기 때문에 전달한 순서가 뒤집혀서 저장됩니다.
reverse() — 데크에 저장된 요소들의 순서를 뒤집습니다.
rotate(n) — 데크를 지정한 횟수만큼 회전시킵니다. 양수를 전달하면 오른쪽으로, 음수를 전달하면 왼쪽으로 회전합니다.
사용 예제
아래 예제는 위에서 소개한 메서드들을 collections.deque로 실제로 구현한 코드입니다.
import collections
de = collections.deque([10, 20, 30, 40])
print(de)
de.append(50)
print("\n오른쪽 끝에 추가한 후 데크 : ")
print(de)
de.appendleft(60)
print("\n왼쪽 끝에 추가한 후 데크 : ")
print(de)
de.pop()
print("\n오른쪽 끝에서 삭제한 후 데크 : ")
print(de)
de.popleft()
print("\n왼쪽 끝에서 삭제한 후 데크 : ")
print(de)
de.extend([70, 80])
print("\n오른쪽 끝에 여러 값 추가 후 데크 : ")
print(de)
de.extendleft([100, 90])
print("\n왼쪽 끝에 여러 값 추가 후 데크 : ")
print(de)
de.rotate(-2)
print("\n회전한 후 데크 : ")
print(de)
de.reverse()
print("\n뒤집은 후 데크 : ")
print(de)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
deque([10, 20, 30, 40]) 오른쪽 끝에 추가한 후 데크 : deque([10, 20, 30, 40, 50]) 왼쪽 끝에 추가한 후 데크 : deque([60, 10, 20, 30, 40, 50]) 오른쪽 끝에서 삭제한 후 데크 : deque([60, 10, 20, 30, 40]) 왼쪽 끝에서 삭제한 후 데크 : deque([10, 20, 30, 40]) 오른쪽 끝에 여러 값 추가 후 데크 : deque([10, 20, 30, 40, 70, 80]) 왼쪽 끝에 여러 값 추가 후 데크 : deque([90, 100, 10, 20, 30, 40, 70, 80]) 회전한 후 데크 : deque([10, 20, 30, 40, 70, 80, 90, 100]) 뒤집은 후 데크 : deque([100, 90, 80, 70, 40, 30, 20, 10])
정리
데크는 양쪽 끝에서의 빠른 삽입과 삭제가 필요한 상황에서 일반 리스트보다 훨씬 효율적입니다. 대표적인 활용 사례로는 BFS(너비 우선 탐색) 큐 구현, 작업 스케줄링, 슬라이딩 윈도우 문제, 실행 취소(Undo) 기능 등이 있습니다. 스택과 큐의 동작을 모두 지원해야 하는 경우 collections.deque를 적극적으로 활용해 보세요.