
์ฝ๋ฉํ ์คํธ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ์ ํ ์๋ฃ๊ตฌ์กฐ์ธ Stack, Queue, Deque์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊บผ๋ธ๋ค๋ ์ ์ ๊ฐ์ง๋ง, ์ด๋ค ์์๋ก ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ฐฉํฅ์์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๊ฐ๋ฅํ๊ฐ์ ๋ฐ๋ผ ์ฉ๋๊ฐ ๋ฌ๋ผ์ง๋๋ค.
์ฆ,
๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค.
์ ์๋ฅผ ์ฐจ๊ณก์ฐจ๊ณก ์์๋๊ณ ๊ฐ์ฅ ์์ ์๋ ์ ์๋ถํฐ ๊บผ๋ด๋ ๋ชจ์ต์ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ์ฃ .

Stack์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์์ ์
push, ๊บผ๋ด๋ ์์ ์pop์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋ชจ๋ Stack์ ๊ฐ์ฅ ์์ชฝ์ธ Top์์ ์ด๋ฃจ์ด์ง๋๋ค.

Python์๋ ๋ณ๋์ Stack ์๋ฃํ์ด ์กด์ฌํ์ง ์์ต๋๋ค.
๋์ ์ผ๋ฐ์ ์ผ๋ก list๋ฅผ Stack์ฒ๋ผ ์ฌ์ฉํฉ๋๋ค.
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack)
# [1, 2, 3]
๊ฐ์ ์ถ๊ฐํ ๋๋ append()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
stack.append(4)
# [1, 2, 3, 4]
๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด์จ ๊ฐ์ ๊บผ๋ผ ๋๋ pop()์ ์ฌ์ฉํฉ๋๋ค.
stack.pop()
# 4
print(stack)
# [1, 2, 3]
pop()์ ๊ฐ์ ๋จ์ํ ์ญ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ญ์ ํ ๊ฐ์ ๋ฐํํ๊ธฐ๋ ํฉ๋๋ค.
๊ฐ์ ์ ๊ฑฐํ์ง ์๊ณ ํ์ฌ Stack์ ๊ฐ์ฅ ์ ๊ฐ์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด [-1]์ ์ฌ์ฉํฉ๋๋ค.
stack[-1]
# 3
๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉํ๋ top()๊ณผ ๊ฐ์ ์ญํ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
Stack์ด ๋น์ด ์๋์ง ํ์ธํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
if not stack:
print("Stack์ด ๋น์ด ์์ต๋๋ค.")
Python์์๋ ๋น ๋ฆฌ์คํธ []๋ฅผ False๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ not stack์ผ๋ก ๊ฐ๋จํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
| ๊ธฐ๋ฅ | Python | ์๊ฐ๋ณต์ก๋ |
|---|---|---|
| ๊ฐ ์ฝ์ | stack.append(x) | O(1) |
| Top ๊ฐ ์ญ์ | stack.pop() | O(1) |
| Top ๊ฐ ํ์ธ | stack[-1] | O(1) |
| ๋น์ด ์๋์ง ํ์ธ | not stack | O(1) |
Stack์ ๋ค์ชฝ์์๋ง ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ Python์
list๋ง์ผ๋ก๋ ์ถฉ๋ถํ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
Stack๊ณผ ๋ฐ๋๋ก,
๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค.
๋งํธ ๊ณ์ฐ๋๋ ๋์ด๊ณต์์ ๋๊ธฐ์ค์ ์๊ฐํ๋ฉด ์ฝ์ต๋๋ค.

๋จผ์ ์ค์ ์ ์ฌ๋์ด ๋จผ์ ๋๊ฐ๋ ๊ฒ์ฒ๋ผ Queue ์ญ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฝ์
์ญ์
โ โ
Rear โ [ 4 ] [ 3 ] [ 2 ] [ 1 ] โ Front
Queue์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ Rear์์ ๋ค์ด์ค๊ณ Front์์ ๋๊ฐ๋๋ค.

์๋ฅผ ๋ค์ด 1 โ 2 โ 3 ์์๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ค๋ฉด,
์
๋ ฅ
1 โ 2 โ 3
๋๊ฐ๋ ์์ ์ญ์
์ถ๋ ฅ
1 โ 2 โ 3
๊ฐ ๋ฉ๋๋ค.
์ด๋ฅผ Stack๊ณผ ๋น๊ตํ๋ฉด ์ฐจ์ด๊ฐ ๋ช ํํฉ๋๋ค.
Stack
์
๋ ฅ : 1 โ 2 โ 3
์ถ๋ ฅ : 3 โ 2 โ 1
Queue
์
๋ ฅ : 1 โ 2 โ 3
์ถ๋ ฅ : 1 โ 2 โ 3
Queue ์ญ์ Python์ ์ฝ๋ฉํ ์คํธ์์ ๋ฐ๋ก ์ฌ์ฉํ๋ ๋ณ๋์ ๋ด์ฅ Queue ์๋ฃํ์ด ์๋ ๊ฒ์ ์๋๋๋ค.
์ฒ์ ์๊ฐํ๋ฉด list๋ฅผ ์ด์ฉํด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์๋ ์์ต๋๋ค.
queue = []
queue.append(1)
queue.append(2)
queue.append(3)
queue.pop(0)
ํ์ง๋ง ์ด๋ ๊ฒ ๊ตฌํํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
์์ผ๊น์?
pop(0)์ด ๋๋ฆฐ ์ด์ ๋ค์๊ณผ ๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์๋ค๊ณ ํด๋ด ์๋ค.
[1, 2, 3, 4]
๋งจ ์์ ์๋ 1์ ์ ๊ฑฐํ๋ฉด
[2, 3, 4]
๊ฐ ๋ฉ๋๋ค.
๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๋จ์ํ 1๋ง ์ ๊ฑฐํ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก๋ ๋ค์ ์๋ ์์๋ค์ ํ ์นธ์ฉ ์์ผ๋ก ์ด๋์์ผ์ผ ํฉ๋๋ค.
[1, 2, 3, 4]
โ โ โ
์์ผ๋ก ์ด๋
[2, 3, 4]
๋ฐ๋ผ์
queue.pop(0)
์ ์๊ฐ๋ณต์ก๋๋ O(N) ์ ๋๋ค.
Queue์์๋ ๋งจ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ๋นํจ์จ์ ์ด๊ฒ ์ฃ .
๊ทธ๋์ Python์์๋ Queue๋ฅผ ๊ตฌํํ ๋ ์ผ๋ฐ์ ์ผ๋ก deque๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ง ๊ทธ๋๋ก
์์ชฝ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ณ ์ญ์ ํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ
์ ๋๋ค.
์ผ๋ฐ์ ์ธ Queue๋ ํ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋ฐ๋์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ง๋ง, Deque๋ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
appendleft() append()
โ โ
[ 1 ] [ 2 ] [ 3 ] [ 4 ]
โ โ
popleft() pop()
Python์์๋ collections ๋ชจ๋์ deque๋ฅผ ์ฌ์ฉํฉ๋๋ค.
from collections import deque
dq = deque()
๊ธฐ์กด ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก deque๋ก ๋ณํํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
from collections import deque
dq = deque([1, 2, 3])
print(dq)
# deque([1, 2, 3])
์ค๋ฅธ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋๋ append()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
dq.append(4)
# deque([1, 2, 3, 4])
์ผ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋๋ appendleft()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
dq.appendleft(0)
# deque([0, 1, 2, 3, 4])
์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ ๋๋ pop(),
dq.pop()
์ผ์ชฝ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ ๋๋ popleft()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
dq.popleft()
๋ฐ๋ผ์ ๋ค์ ๋ค ๊ฐ์ง๊ฐ Deque์ ํต์ฌ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
dq.append(x) # ์ค๋ฅธ์ชฝ ์ฝ์
dq.appendleft(x) # ์ผ์ชฝ ์ฝ์
dq.pop() # ์ค๋ฅธ์ชฝ ์ญ์
dq.popleft() # ์ผ์ชฝ ์ญ์
์ ๋์ ๊ฐ์ ์ ๊ฑฐํ์ง ์๊ณ ํ์ธํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
dq[0] # ๊ฐ์ฅ ์ผ์ชฝ ๊ฐ
dq[-1] # ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ๊ฐ
| ๊ธฐ๋ฅ | Python | ์๊ฐ๋ณต์ก๋ |
|---|---|---|
| ์ค๋ฅธ์ชฝ ์ฝ์ | append() | O(1) |
| ์ผ์ชฝ ์ฝ์ | appendleft() | O(1) |
| ์ค๋ฅธ์ชฝ ์ญ์ | pop() | O(1) |
| ์ผ์ชฝ ์ญ์ | popleft() | O(1) |
deque์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์์ชฝ ๋์ ์ฝ์
๊ณผ ์ญ์ ๊ฐ ๋ชจ๋ O(1) ์ด๋ผ๋ ์ ์
๋๋ค.
์ฌ๊ธฐ๊น์ง ๋ณด๋ฉด ํ ๊ฐ์ง ์๋ฌธ์ด ์๊ธธ ์ ์์ต๋๋ค.
Deque๋ ์์ชฝ์์ ๋ชจ๋ ๋ฃ๊ณ ๋บ ์ ์์ผ๋ Stack๊ณผ Queue ๋ ๋ค ๋ง๋ค ์ ์์ง ์์๊น?
๋ง์ต๋๋ค.
Deque๋ ์ฌ์ฉํ๋ ๋ฐฉํฅ์ ๋ฐ๋ผ Stack์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๊ณ Queue์ฒ๋ผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ค๋ฅธ์ชฝ์์ ๋ฃ๊ณ ์ค๋ฅธ์ชฝ์์ ๋ค์ ๊บผ๋ด๋ฉด ๋ฉ๋๋ค.
from collections import deque
stack = deque()
stack.append(1)
stack.append(2)
stack.append(3)
stack.pop()
append()
โ
[ 1 ] [ 2 ] [ 3 ]
โ
pop()
๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด์จ 3์ด ๊ฐ์ฅ ๋จผ์ ๋์ค๊ธฐ ๋๋ฌธ์ LIFO, ์ฆ Stack์ด ๋ฉ๋๋ค.
๋ค๋ง Stack์ list๋ง์ผ๋ก๋ ๋ค์ชฝ ์ฝ์
๊ณผ ์ญ์ ๊ฐ O(1)์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก๋ ๊ตณ์ด deque๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
stack = []
์ ๋๋ก ์ถฉ๋ถํฉ๋๋ค.
์ด๋ฒ์๋ ์ค๋ฅธ์ชฝ์์ ๋ฃ๊ณ ์ผ์ชฝ์์ ๊บผ๋ ๋๋ค.
from collections import deque
queue = deque()
queue.append(1)
queue.append(2)
queue.append(3)
queue.popleft()
popleft() append()
โ โ
[ 1 ] [ 2 ] [ 3 ]
๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ 1์ด ๊ฐ์ฅ ๋จผ์ ๋์ค๊ธฐ ๋๋ฌธ์ FIFO, ์ฆ Queue๊ฐ ๋ฉ๋๋ค.
Python ์ฝ๋ฉํ ์คํธ์์ Queue๋ฅผ ๊ตฌํํ ๋ ๊ฐ์ฅ ํํ๊ฒ ๋ณด๋ ํํ์ ๋๋ค.
Stack๊ณผ Queue๋ฅผ Python์ผ๋ก ๊ตฌํํ ๋ list์ deque๋ฅผ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ ์ด์ ๋ ์๊ฐ๋ณต์ก๋์ ์์ต๋๋ค.
| ์ฐ์ฐ | list | deque |
|---|---|---|
| ์ค๋ฅธ์ชฝ ์ฝ์ | O(1) | O(1) |
| ์ค๋ฅธ์ชฝ ์ญ์ | O(1) | O(1) |
| ์ผ์ชฝ ์ฝ์ | O(N) | O(1) |
| ์ผ์ชฝ ์ญ์ | O(N) | O(1) |
list๋ ์ค๋ฅธ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋ ๊ฒ์ ๋น ๋ฅด์ง๋ง, ์ผ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ฑฐ๋ ์ ๊ฑฐํ๋ ค๋ฉด ๊ธฐ์กด ์์๋ค์ ์ด๋์์ผ์ผ ํฉ๋๋ค.
๋ฐ๋ฉด deque๋ ์์ชฝ ๋์์ ์ฝ์
๊ณผ ์ญ์ ๋ฅผ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋๋ก ๋ง๋ค์ด์ ธ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฝ๋ฉํ ์คํธ์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ์ตํ๋ฉด ํธํฉ๋๋ค.
Stack โ list
Queue โ deque
Deque โ deque
| ์๋ฃ๊ตฌ์กฐ | ํน์ง | ๋์ ๋ฐฉ์ | Python |
|---|---|---|---|
| Stack | ํ์ชฝ์์ ์ฝ์ / ์ญ์ | LIFO | list |
| Queue | ๋ค์์ ์ฝ์ / ์์์ ์ญ์ | FIFO | deque |
| Deque | ์์ชฝ์์ ์ฝ์ / ์ญ์ | ์๋ฐฉํฅ | deque |
์กฐ๊ธ ๋ ๊ฐ๋จํ๊ฒ ๊ทธ๋ฆผ์ผ๋ก ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โ append()
[ 3 ] โ Top
[ 2 ]
[ 1 ]
โ pop()
LIFO
Last In First Out
popleft() โ [ 1 ] [ 2 ] [ 3 ] โ append()
FIFO
First In First Out
appendleft() โ [ 1 ] [ 2 ] [ 3 ] โ append()
โ โ
popleft() pop()
Stack, Queue, Deque๋ ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๊ณ ๋๊ฐ๋ ์์์ ๋ฐฉํฅ์ ์ดํดํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
๋ฌธ์ ์์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ฉด Stack,
๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๋ฉด Queue,
์์ชฝ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์์ ๋กญ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํด์ผ ํ๋ค๋ฉด Deque๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค.
Python์์๋ ๋ง์ง๋ง์ผ๋ก ๋ค์ ์ ๋๋ง ํ์คํ๊ฒ ๊ธฐ์ตํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
# Stack
stack = []
stack.append(x)
stack.pop()
stack[-1]
# Queue
from collections import deque
queue = deque()
queue.append(x)
queue.popleft()
# Deque
dq.append(x)
dq.appendleft(x)
dq.pop()
dq.popleft()
Stack โ list
Queue โ deque
Deque โ deque
์๋ฃ๊ตฌ์กฐ ์์ฒด๋ ๋จ์ํ์ง๋ง ์ค์ ๋ฌธ์ ์์๋ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํด์ผ ํ๋์ง๋ฅผ ํ๋จํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.