Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 데크(Deque) 완벽 정리: collections 모듈로 스택과 큐를 한 번에

데크(Deque, Double-Ended Queue)는 스택과 큐 구조를 일반화한 자료구조입니다. 이름 그대로 양쪽 끝에서 요소를 추가하거나 제거할 수 있으며, 리스트 객체를 기반으로 생성됩니다. 특히 요소를 추가(append)하고 제거(pop)하는 연산이 모두 O(1)의 시간 복잡도로 처리되어 성능 면에서 매우 효율적입니다.

데크는 파이썬 표준 라이브러리 클래스로, collections 모듈에 포함되어 있습니다.

데크 사용 준비하기

데크를 사용하려면 먼저 collections 모듈을 임포트해야 합니다.

import collections

이제 데크 클래스에서 자주 사용하는 주요 함수들을 하나씩 살펴보겠습니다.

1. 요소 추가 함수 — append()와 appendleft()

데크에는 두 가지 종류의 추가 함수가 있습니다.

  • append(): 큐의 오른쪽 끝에 요소를 추가합니다.
  • appendleft(): 큐의 왼쪽 끝에 요소를 추가합니다.

예제 코드

import collections as col

# 처음에 몇 개의 요소를 삽입
my_deque = col.deque('124dfre')
print('Dequeue: ' + str(my_deque))

# 오른쪽에는 x, 왼쪽에는 B 추가
my_deque.append('x')
my_deque.appendleft('B')
print('Dequeue after appending: ' + str(my_deque))

실행 결과

Dequeue: deque(['1', '2', '4', 'd', 'f', 'r', 'e'])
Dequeue after appending: deque(['B', '1', '2', '4', 'd', 'f', 'r', 'e', 'x'])

2. 요소 제거 함수 — pop()과 popleft()

추가와 마찬가지로 제거 함수도 두 가지입니다.

  • pop(): 큐의 가장 오른쪽 요소를 제거하고 반환합니다.
  • popleft(): 큐의 가장 왼쪽 요소를 제거하고 반환합니다.

예제 코드

import collections as col

my_deque = col.deque('124dfre')
print('Dequeue: ' + str(my_deque))

# 오른쪽과 왼쪽에서 각각 요소 삭제
item = my_deque.pop()
print('Popped Item: ' + str(item))
item = my_deque.popleft()
print('Popped Item: ' + str(item))
print('Dequeue after pop operations: ' + str(my_deque))

실행 결과

Dequeue: deque(['1', '2', '4', 'd', 'f', 'r', 'e'])
Popped Item: e
Popped Item: 1
Dequeue after pop operations: deque(['2', '4', 'd', 'f', 'r'])

3. 항목 정보 조회 함수 — index()와 count()

데크에는 항목 관련 정보를 얻기 위한 함수들도 있습니다. 대표적으로 index()와 count()가 있습니다.

  • index(): 특정 요소가 처음 나타나는 인덱스를 반환합니다. 시작·끝 범위를 지정하면 해당 범위 내에서만 검색하며, 범위를 지정하지 않으면 전체 목록을 대상으로 검색합니다.
  • count(): 특정 항목이 데크 안에 등장하는 횟수를 반환합니다.

예제 코드

import collections as col

my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))

# D의 인덱스 찾기
print('Index of D:' + str(my_deque.index('D')))
print('Index of D in range 5 to 8 is: ' + str(my_deque.index('D', 5, 8)))

# 등장 횟수 세기
print('Occurrences of A: ' + str(my_deque.count('A')))
print('Occurrences of D: ' + str(my_deque.count('D')))

실행 결과

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Index of D:4
Index of D in range 5 to 8 is: 5
Occurrences of A: 2
Occurrences of D: 3

4. 위치 지정 삽입과 삭제 — insert()와 remove()

앞서 본 append와 pop 외에도 삽입·삭제와 관련된 두 가지 메서드가 더 있습니다.

  • insert(index, 값): 원하는 인덱스 위치에 직접 요소를 삽입할 수 있습니다.
  • remove(값): 해당 요소가 처음 나타나는 위치의 항목 하나만 제거합니다.

예제 코드

import collections as col

my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))

# 5번 위치에 G, 7번 위치에 H 삽입
my_deque.insert(5, 'G')
my_deque.insert(7, 'H')
print('Dequeue after inserting: ' + str(my_deque))

# 첫 번째 D 삭제
my_deque.remove('D')
print('Dequeue after removing: ' + str(my_deque))

실행 결과

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Dequeue after inserting: deque(['A', 'A', 'B', 'C', 'D', 'G', 'D', 'H', 'E', 'F', 'D'])
Dequeue after removing: deque(['A', 'A', 'B', 'C', 'G', 'D', 'H', 'E', 'F', 'D'])

5. 여러 요소 한꺼번에 추가 — extend()와 extendleft()

확장 함수는 여러 개의 요소를 한 번에 데크에 추가할 때 사용합니다. 리스트나 튜플 같은 컬렉션을 인자로 넘겨 여러 값을 전달할 수 있습니다.

  • extend(): 오른쪽 끝에 요소들을 순서대로 추가합니다. append()를 반복 호출하는 것과 같습니다.
  • extendleft(): 왼쪽 끝에 요소들을 추가합니다. 단, appendleft()를 반복하는 방식이라 입력한 순서의 역순으로 저장된다는 점에 유의해야 합니다.

예제 코드

import collections as col

my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))

# 오른쪽에 1, 3, 5, 7 / 왼쪽에 x, y, z 추가
my_deque.extend([1, 3, 5, 7])
my_deque.extendleft(['x', 'y', 'z'])
print('Dequeue after Extending: ' + str(my_deque))

실행 결과

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Dequeue after Extending: deque(['z', 'y', 'x', 'A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D', 1, 3, 5, 7])

6. 뒤집기와 회전 — reverse()와 rotate()

reverse() 메서드를 사용하면 데크의 요소 순서를 손쉽게 뒤집을 수 있습니다. 또한 rotate() 메서드를 이용하면 인자로 지정한 수만큼 데크를 회전시킬 수 있습니다.

  • 양수를 전달하면 오른쪽으로 회전합니다.
  • 음수를 전달하면 왼쪽으로 회전합니다.

예제 코드

import collections as col

my_deque = col.deque('AABCDDEFD')
print('Dequeue: ' + str(my_deque))

my_deque.reverse()
print('Deque after Reversing:' + str(my_deque))

# 오른쪽으로 3칸 회전
my_deque.rotate(3)
print('Deque after rotating:' + str(my_deque))

실행 결과

Dequeue: deque(['A', 'A', 'B', 'C', 'D', 'D', 'E', 'F', 'D'])
Deque after Reversing:deque(['D', 'F', 'E', 'D', 'D', 'C', 'B', 'A', 'A'])
Deque after rotating:deque(['B', 'A', 'A', 'D', 'F', 'E', 'D', 'D', 'C'])

마무리

파이썬의 데크는 양방향 삽입·삭제가 O(1)로 가능하기 때문에 스택이나 큐, BFS(너비 우선 탐색)의 대기열, 최근 항목 캐싱 등 다양한 상황에서 활용도가 높습니다. append/pop 계열, extend 계열, index/count, insert/remove, reverse/rotate까지 익혀두면 실전 코딩에서 자료구조 처리가 한결 수월해질 것입니다.