
큐는 데이터를 먼저 넣은 것이 먼저 나오는(FIFO: First In, First Out) 방식의 자료구조.
줄을 서서 기다리는 상황과 유사하며, 가장 먼저 들어간 데이터가 가장 먼저 처리됨.
| 연산 | 설명 | 시간 복잡도 |
|---|---|---|
| enqueue | 데이터를 큐에 추가 | O(1) |
| dequeue | 큐에서 가장 앞의 데이터를 제거 | O(n) |
| front | 큐의 맨 앞 요소 확인 | O(1) |
| rear | 큐의 맨 끝 요소 확인 | O(1) |
| isEmpty | 큐가 비어 있는지 확인 | O(1) |
일반적인 리스트(List)를 사용하면 dequeue 연산이 O(n) (앞에서 제거하면 전체 이동) 발생.
이를 해결하기 위해 Deque(Double-ended Queue) 또는 링 버퍼를 활용.
python
복사편집
queue = []
queue.append(1) # Enqueue
queue.append(2)
queue.append(3)
print(queue.pop(0)) # Dequeue, 1 출력
pop(0) 사용 시 O(n) 발생 → 비효율적
python
복사편집
from collections import deque
queue = deque()
queue.append(1)
queue.append(2)
queue.append(3)
print(queue.popleft()) # Dequeue, 1 출력
popleft() 사용 시 O(1) → 효율적

python
복사편집
class RingBuffer:
def __init__(self, size):
self.buffer = [None] * size
self.max_size = size
self.front = 0
self.rear = 0
self.count = 0
def enqueue(self, value):
if self.count == self.max_size:
print("Queue is full")
return
self.buffer[self.rear] = value
self.rear = (self.rear + 1) % self.max_size
self.count += 1
def dequeue(self):
if self.count == 0:
print("Queue is empty")
return None
value = self.buffer[self.front]
self.front = (self.front + 1) % self.max_size
self.count -= 1
return value
queue = RingBuffer(3)
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
print(queue.dequeue()) # 1 출력
queue.enqueue(4)
print(queue.dequeue()) # 2 출력
고정된 크기 내에서 O(1)로 동작하는 큐
일반적인 큐는 순서대로 데이터를 꺼내지만, 우선순위 큐는 더 높은 우선순위를 가진 데이터를 먼저 처리
| 연산 | 설명 | 시간 복잡도 |
|---|---|---|
| enqueue | 데이터를 추가하며 정렬 유지 | O(log n) |
| dequeue | 가장 우선순위가 높은 요소 제거 | O(log n) |
| peek | 가장 우선순위가 높은 요소 확인 | O(1) |
python
복사편집
import heapq
pq = []
heapq.heappush(pq, (2, "task2")) # 우선순위 2
heapq.heappush(pq, (1, "task1")) # 우선순위 1 (가장 먼저 처리됨)
heapq.heappush(pq, (3, "task3")) # 우선순위 3
print(heapq.heappop(pq)) # (1, 'task1') 출력
print(heapq.heappop(pq)) # (2, 'task2') 출력
# 파이썬 Priority Queue 라이브러리
from Queue import Priority Queue
최소 힙(Min-Heap) 구조로 자동 정렬됨
우선순위가 낮을수록 먼저 나옴 (높은 우선순위를 원하면 -값 사용)
장점
단점
pop(0) 시 O(n) 발생)