Programming/Python

[Python] Deque

owls 2023. 6. 3. 15:55
728x90

 

list를 이용해서 queue처럼 사용할 수 있습니다.

queue = [1, 2, 3]
queue.append(4)    #[1, 2, 3, 4]
queue.pop(0)       #[2, 3, 4]
queue.insert(0, 5) #[5, 2, 3, 4]

하지만 list를 queue처럼 사용하는 것은 성능 측면에서 추천되지 않습니다.

list는 Random Access에 최적화된 자료구조이기 때문에 pop(0), insert(0, x)는 성능적으로 매우 불리한 연산입니다.

이 연산의 시간 복잡도는 O(n)입니다.

 

Deque

collections 모듈의 deque를 사용해서 queue, stack 자료구조를 구현할 수 있습니다.

collections에 queue도 있지만 Deque가 훨씬 빠르니 코딩테스트에서는 Deque를 사용하는 것이 좋습니다.

 

method

append(item) item을 deque의 맨 뒤(오른쪽 끝)에 삽입한다.
appendleft(item) item을 deque의 맾 앞(왼쪽 끝)에 삽입한다.
pop() deque의 오른쪽 끝 element를 가져오는 동시에 deque에서 삭제한다.
popleft() deque의 왼쪽 끝 element를 가져오는 동시에 deque에서 삭제한다.
extend(array) 주어진 배열(array)를 순환하면서 deque의 오른쪽에 추가한다.
extendleft(array) 주어진 배열(array)를 순환하면서 deque의 왼쪽에 추가한다.
remove(item) item을 deque에서 찾아 삭제한다.
rotate(num) deque를 num만큼 회전한다.(양수 : 오른쪽, 음수 : 왼쪽)

 

example

from collections import deque

n = 3
m = 4
queue = deque([1,2,3,4,5])
queue.rotate(1)             #deque([5, 1, 2, 3, 4])

queue.rotate(-1)            #deque([1, 2, 3, 4, 5])

queue.remove(4)             #deque([1, 2, 3, 5])

arr = [8, 7, 9]
queue.extend(arr)           #deque([1, 2, 3, 5, 8, 7, 9])

arr = [11, 12, 10]
queue.extendleft(arr)       #deque([10, 12, 11, 1, 2, 3, 5, 8, 7, 9])
                            #arr앞에서 부터 deque앞에 추가한다.

 

Queue

from collections import deque

queue = deque([1, 2])
queue.append(3)         #deque([1, 2, 3])
queue.append(4)         #deque([1, 2, 3, 4])

a = queue.popleft()     # a = 1
                        # deque([2, 3, 4])
b = queue.popleft()     # b = 2
                        # deque([3, 4])

 

Stack

from collections import deque

queue = deque([1, 2])
queue.appendleft(3)     #deque([3, 1, 2])
queue.appendleft(4)     #deque([4, 3, 1, 2])

a = queue.popleft()     # a = 4
                        # deque([3, 1, 2])

b = queue.popleft()     # b = 3
                        #deque([1, 2])

 

 

728x90