collections.deque 사용list보다 큐 구현에 훨씬 효율적 (양쪽 모두 O(1))from collections import deque
| 메서드 | 설명 |
|---|---|
append(x) | 오른쪽에 추가 |
appendleft(x) | 왼쪽에 추가 |
pop() | 오른쪽에서 제거 |
popleft() | 왼쪽에서 제거 |
extend(iter) | 오른쪽에 여러 개 추가 |
extendleft(iter) | 왼쪽에 여러 개 추가 |
rotate(n) | n만큼 회전 (오른쪽: 양수 / 왼쪽: 음수) |
reverse() | 순서 뒤집기 |
q = deque()
q.append(1)
q.append(2)
q.append(3)
q.popleft() # 1
q.popleft() # 2
s = deque()
s.append(10)
s.append(20)
s.pop() # 20
dq = deque()
dq.append(1) # [1]
dq.appendleft(0) # [0, 1]
dq.append(2) # [0, 1, 2]
dq.pop() # 2
dq.popleft() # 0
| 연산 | 시간복잡도 |
|---|---|
append, appendleft | O(1) |
pop, popleft | O(1) |
리스트로 구현 시 pop(0)은 O(N)
→ 큐는 무조건 deque로 구현
import sys
from collections import deque
input = sys.stdin.readline
dq = deque()
n = int(input())
for _ in range(n):
cmd = input().strip()
if cmd.startswith("push"):
_, x = cmd.split()
dq.append(int(x))
elif cmd == "pop":
print(dq.popleft() if dq else -1)
elif cmd == "size":
print(len(dq))
elif cmd == "empty":
print(1 if not dq else 0)
elif cmd == "front":
print(dq[0] if dq else -1)
elif cmd == "back":
print(dq[-1] if dq else -1)
self.front = (self.front + 1) % self.size
self.count -= 1
deque는 리스트보다 빠른 큐/스택 구현 가능