큐queue
는 '줄을 서다' 라는 뜻을 가지고 있다. 큐는 먼저 들어간 데이터가 먼저 나오는 자료구조이다. 맛집에서 줄을 선 순서대로 식당에 입장할 때를 생각하면 된다.
이런 큐의 특징을 선입선출 또는 FIFO(first in first out)
이라고 한다. 스택과 마찬가지로 큐도 삽입하는 연산을 푸시, 꺼내는 연산을 팝이라고 한다.
먼저 들어온 것을 먼저 처리하는 큐의 동작 방식은 프로그래밍 언어에서 많이 활용되고 있다. 대표적으로 여러 이벤트가 발생한 순서대로 처리할 때 큐가 활용된다.
작업 대기열: 네트워크 통신을 할 때 다수의 요청이 서버에 들어오면 서버는 요청이 들어온 순서대로 작업을 처리한다.
이벤트 처리: 어떤 애플리케이션이나 시스템에서 사용자의 이벤트, 예를 들어 키보드 입력이나 마우스 움직임을 처리할 때 큐를 활용할 수 있다.
이와 같은 특성으로 인해 큐는 데이터 처리 순서를 보장하고, 특정 순서로 처리해야 할 필요가 있는 다양한 애플리케이션에서 중요한 역할을 한다.
알겠어요! 아까 보내준 내용을 당신의 게시물에 맞게 추가해보겠습니다:
파이썬에서 큐(Queue)는 주로 데이터를 넣는 enqueue(인큐)와 데이터를 빼내는 dequeue(디큐) 연산을 지원한다. 큐는 일반적으로 리스트를 이용해 구현할 수 있지만, 파이썬에서는 collections
모듈의 deque
클래스를 사용하여 효율적으로 구현할 수 있다.
여기서 deque
는 double-ended queue
의 약자로, 큐의 양 끝에서 데이터의 추가와 삭제가 모두 가능한 자료구조이다. deque
를 사용하면 큐의 양 끝에서의 연산이 O(1)의 시간복잡도로 수행될 수 있어서 효율적이다.
deque
from collections import deque
# 큐 생성
queue = deque()
# 데이터 enqueue (큐의 맨 뒤에 데이터 추가)
queue.append(1) # 큐에 1을 추가 -> deque([1])
queue.append(2) # 큐에 2를 추가 -> deque([1, 2])
queue.append(3) # 큐에 3을 추가 -> deque([1, 2, 3])
# 큐 상태 출력
print("현재 큐 상태:", queue) # 현재 큐 상태: deque([1, 2, 3])
# 데이터 dequeue (큐의 맨 앞에서 데이터 삭제 및 반환)
item = queue.popleft()
print("꺼낸 항목:", item) # 큐에서 꺼낸 항목: 1
print("업데이트된 큐:", queue) # 업데이트된 큐 상태: deque([2, 3])
위 예제에서 deque
는 collections
모듈에서 가져온 후, append()
메서드로 데이터를 큐에 추가하고, popleft()
메서드로 데이터를 큐에서 제거하면서 가져올 수 있다.
연산 | 설명 | 시간복잡도 |
---|---|---|
queue = deque() | 빈 큐 생성 | O(1) |
queue.append(item) | 큐의 맨 뒤에 데이터(item) 추가 | O(1) |
queue.popleft() | 큐의 맨 앞에서 데이터 제거 및 반환 | O(1) |
queue.clear() | 큐의 모든 데이터 제거 | O(1) |
len(queue) | 큐의 길이(데이터 개수) 반환 | O(1) |
item in queue | 큐에 특정 데이터(item) 존재 여부 확인 | O(n) |
queue.rotate(n) | 큐를 n번 회전 (양수일 경우 오른쪽으로, 음수일 경우 왼쪽으로) | O(n) |
파이썬에서는 queue
모듈도 제공되며, 이 모듈은 스레드 간 안전한 큐 클래스인 Queue
를 제공한다. 멀티스레드 환경에서 데이터를 안전하게 공유해야 할 때 유용하게 사용할 수 있다.