7강 / 20강

큐와 덱 — 먼저 온 사람이 먼저

줄 서기, 그리고 앞뒤로 다 되는 줄

큐와 덱 — 먼저 온 사람이 먼저
큐는 매표소 앞의 줄입니다. 뒤로 들어와서 앞으로 나갑니다.

급식실 줄을 새치기하면 어떻게 되나요? 난리가 나죠. 먼저 온 사람이 먼저 받는다는 규칙이 FIFO(First In, First Out)이고, 이 규칙의 자료구조가 큐(queue)입니다.

📚 스택 (LIFO)
넣는 곳과 빼는 곳이 같은 쪽
마지막에 넣은 것이 먼저
되돌아가기 · 실행 취소
🚶 큐 (FIFO)
넣는 곳과 빼는 곳이 반대쪽
먼저 넣은 것이 먼저
순서 지키기 · 대기열

프린터 인쇄 대기열, 게임 매칭 대기줄, 고객센터 상담 순서 — 전부 큐입니다.

리스트로 만든 큐 — 동작은 맞지만, 문제가 하나 있습니다.
Python 브라우저에서 실행

deque — 양쪽 끝이 모두 빠른 줄

collections.deque(데크, double-ended queue)는 맨 앞과 맨 뒤 모두 즉시 넣고 뺄 수 있게 만들어진 자료구조입니다. 8강에서 배울 연결 리스트와 비슷한 방식으로 만들어져서, 밀어내기가 아예 일어나지 않아요.

deque 는 앞뒤 네 가지 동작이 전부 빠릅니다.
Python 브라우저에서 실행

🎮 줄 서기 실험실 — 속도까지 재 봅니다

사람을 줄에 세우고 빼면서 큐가 어떻게 도는지 보세요. 아래쪽 속도 대결 버튼을 누르면 list.pop(0) 과 deque.popleft() 의 차이가 숫자로 나옵니다.

줄 서기 — FIFO 동작과 list vs deque 속도 비교
불러오는 중…
3만 명 줄을 다 빼는 데 걸리는 시간. 직접 재 봅니다.
Python 브라우저에서 실행

덱(deque)은 스택도 되고 큐도 됩니다

양쪽 끝이 다 열려 있으니, 어느 쪽으로 넣고 어느 쪽으로 빼느냐만 정하면 됩니다.

쓰고 싶은 것넣기빼기
스택 (LIFO)append()pop() — 같은 쪽
큐 (FIFO)append()popleft() — 반대쪽
덱 (양쪽)append() / appendleft()pop() / popleft()

15강에서 미로를 탐색할 때, 같은 코드에서 이 한 줄만 바꿔 BFS와 DFS를 오가게 됩니다.

덱의 양쪽 끝을 동시에 쓰는 대표적인 예.
Python 브라우저에서 실행
🤔 확인 문제
큐에 A, B, C 를 넣은 뒤 두 번 꺼내면 나오는 순서는?
🤔 확인 문제
파이썬 리스트로 큐를 만들면 안 되는 이유는?
🤔 확인 문제
deque 로 스택을 만들려면?