ํ(Queue)๋ ์๋ฃ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์ ์ค ํ๋๋ก, ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ์ ์ ์ ์ถ(FIFO, First In First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ๋ ์ผ์์ํ์์๋ ๋ง์ด ๋ณผ ์ ์๋ ์๋ฃ๊ตฌ์กฐ๋ก, ์๋ฅผ ๋ค์ด ์ํ์ ๋๊ธฐ ์ค์ด ํ์ ๋ํ์ ์ธ ์์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ํ์ด์ฌ์์ ํ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๊ณ ํ์ฉํ ์ ์๋์ง ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
01. ํ ์๋ฃ๊ตฌ์กฐ๋?๐
ํ ์๋ฃ๊ตฌ์กฐ๋ ๋ฌด์์ธ๊ฐ?
ํ(Queue)๋ ์ปดํจํฐ ๊ณผํ์์ ๋งค์ฐ ์ค์ํ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค. ํ๋ ์ ์
์ ์ถ(FIFO, First In First Out) ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ
๋๋ค. ์ด๋ ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ๋ฐฉ์์ผ๋ก, ์ํ์ ๋๊ธฐ ์ค์ด๋ ๋ฒ์ค ์ ๋ฅ์ฅ์ ์ค๊ณผ ๊ฐ์ ์ผ์์ํ์์๋ ์ฝ๊ฒ ์ฐพ์๋ณผ ์ ์๋ ๊ตฌ์กฐ์
๋๋ค.
ํ์ ๊ธฐ๋ณธ ์๋ฆฌ์ ์๋ ๋ฐฉ์
ํ๋ ๋ ๊ฐ์ง ์ฃผ์ ์ฐ์ฐ์ธ ์ฝ์ (Enqueue)๊ณผ ์ญ์ (Dequeue)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฝ์ ์ฐ์ฐ์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ํ์ ๋ค(rear)๋ก ๋ฃ๋ ๊ฒ์ด๊ณ , ์ญ์ ์ฐ์ฐ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ํ์ ์(front)์์ ๋นผ๋ ๊ฒ์ ๋๋ค. ์ด ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ํตํด ํ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ํ์ ๋๊ธฐ ์ค์ ์๊ฐํด๋ด ์๋ค. ์๋ก์ด ๊ณ ๊ฐ์ด ์ค๋ฉด ์ค์ ๋งจ ๋ค์ ์๊ฒ ๋๊ณ , ์ค์ ๋งจ ์์ ์๋ ๊ณ ๊ฐ์ด ๋จผ์ ์ฐฝ๊ตฌ๋ก ์ด๋ํด ์๋น์ค๋ฅผ ๋ฐ์ต๋๋ค. ์ด์ ๊ฐ์ ์๋ฆฌ๋ก ํ๋ ๋ฐ์ดํฐ์ ์์๋ฅผ ์ ์งํ๊ณ , ์ฐจ๋ก๋๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์ต๋๋ค.
ํ๋ ๋จ์ํ๋ฉด์๋ ๋งค์ฐ ๊ฐ๋ ฅํ ์๋ฃ๊ตฌ์กฐ๋ก, ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ก๊ทธ๋จ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ BFS(Breadth-First Search)์์ ํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ํ, ์์ ์ค์ผ์ค๋ง, ๋๊ธฐ์ด ๊ด๋ฆฌ, ์น ์๋ฒ ์์ฒญ ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ์ค์ํ ์์ฉ์์๋ ํ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
ํ์ ์คํ์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น์?
ํ๋ ์ ์
์ ์ถ(FIFO) ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์คํ์ ํ์
์ ์ถ(LIFO) ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์คํ์ ๊ดํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
02. ํ์ ์ฃผ์ ์ฐ์ฐ๐
ํ ์๋ฃ๊ตฌ์กฐ์์๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ฐ์ฐ์ด ์์ต๋๋ค. ์ด ์ฐ์ฐ๋ค์ ํตํด ํ์ ๊ธฐ๋ณธ ๋์์ ์ดํดํ ์ ์์ต๋๋ค.
์ฝ์
(Enqueue), ์ญ์ (Dequeue), ํ๋ก ํธ(Front), ํ๋ฐฉ(Rear) ์ฐ์ฐ ์ธ์๋ ํ์ ์ํ๋ฅผ ํ์ธํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ์ฐ์ฐ์ธ is_full, peek, size ์ฐ์ฐ์ ๋ํด ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
์ฝ์ (Enqueue) ์ฐ์ฐ
์ฝ์ ์ฐ์ฐ์ ํ์ ๋ค(rear)๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์์ ์ ๋๋ค. ์๋ก์ด ๋ฐ์ดํฐ๋ ํญ์ ํ์ ๋ง์ง๋ง ์์น์ ์ถ๊ฐ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
from collections import deque # collections ๋ชจ๋์์ deque ํด๋์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
queue = deque() # ๋น ํ๋ฅผ ์์ฑํฉ๋๋ค.
# ์ฝ์
(Enqueue)
queue.append(3) # ํ์ ๋ค์ 3์ ์ถ๊ฐํฉ๋๋ค.
์ญ์ (Dequeue) ์ฐ์ฐ
์ญ์ ์ฐ์ฐ์ ํ์ ์(front)์์ ๋ฐ์ดํฐ๋ฅผ ๋นผ๋ ์์ ์ ๋๋ค. ํ์ ๊ฐ์ฅ ์์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋๊ณ ๋ฐํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ ์ ์ ์ ์ถ(FIFO) ์์น์ ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค.
# ์ญ์ (Dequeue)
queue.popleft() # ํ์ ์์์ 3์ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
ํ๋ก ํธ(Front) ์ฐ์ฐ
ํ๋ก ํธ ์ฐ์ฐ์ ํ์ ๊ฐ์ฅ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ์์ ์ ๋๋ค. ์ด ์ฐ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ํ์ฌ ํ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
# ํ๋ก ํธ(Front)
front = queue[0] # ํ์ ๊ฐ์ฅ ์์ ์๋ ์์๋ฅผ ํ์ธํฉ๋๋ค.
ํ๋ฐฉ(Rear) ์ฐ์ฐ
ํ๋ฐฉ ์ฐ์ฐ์ ํ์ ๊ฐ์ฅ ๋ค์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ์์ ์ ๋๋ค. ์ด ์ฐ์ฐ ์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ํ์ฌ ํ์ ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํฉ๋๋ค.
# ํ๋ฐฉ(Rear)
rear = queue[-1] # ํ์ ๊ฐ์ฅ ๋ค์ ์๋ ์์๋ฅผ ํ์ธํฉ๋๋ค.
ํ์ ๋น ์ํ ํ์ธ
ํ๊ฐ ๋น์ด ์๋์ง ํ์ธํ๋ ๊ฒ๋ ์ค์ํ ์ฐ์ฐ ์ค ํ๋์ ๋๋ค. ์ด๋ฅผ ํตํด ์ญ์ ์ฐ์ฐ ๋๋ ํ๋ก ํธ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ ์ ํ๊ฐ ๋น์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
# ํ๊ฐ ๋น์ด ์๋์ง ํ์ธ
is_empty = len(queue) == 0 # ํ์ ๊ธธ์ด๊ฐ 0์ธ์ง ํ์ธํ์ฌ ๋น ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
print(is_empty) # ์ถ๋ ฅ: False
ํ์ ๊ฝ ์ฐฌ ์ํ ํ์ธ
๊ณ ์ ํฌ๊ธฐ์ ํ์์๋ ํ๊ฐ ๊ฝ ์ฐฌ ์ํ์ธ์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ CircularQueue์ ๊ฐ์ ๊ณ ์ ํฌ๊ธฐ ํ์์ ์ ์ฉํฉ๋๋ค.
class CircularQueue:
def __init__(self, size):
self.size = size # ํ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค.
self.queue = [None] * size # ํฌ๊ธฐ๋งํผ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ์ฌ ํ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
self.front = self.rear = -1 # front์ rear๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
def is_full(self):
# rear ๋ค์ ์์น๊ฐ front์ธ ๊ฒฝ์ฐ ํ๊ฐ ๊ฐ๋ ์ฐฌ ์ํ์
๋๋ค.
return (self.rear + 1) % self.size == self.front
# ์ฌ์ฉ ์์
cq = CircularQueue(3) # ํฌ๊ธฐ๊ฐ 3์ธ ํํ ํ๋ฅผ ์์ฑํฉ๋๋ค.
print(cq.is_full()) # ์ถ๋ ฅ: False
๋งจ ์์ ์์ ํ์ธ(Peek)
Peek ์ฐ์ฐ์ ํ์ ๋งจ ์(front) ์์๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ํ์ธํ๋ ์์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ์ง ์๊ณ ํ์ ์ํ๋ฅผ ํ์ ํ ์ ์์ต๋๋ค.
# ๋งจ ์์ ์์ ํ์ธ(Peek)
def peek(queue):
if len(queue) > 0: # ํ์ ๊ธธ์ด๊ฐ 0๋ณด๋ค ํฐ ๊ฒฝ์ฐ
return queue[0] # ํ์ ๋งจ ์ ์์๋ฅผ ๋ฐํํฉ๋๋ค.
else:
return "Queue is empty" # ํ๊ฐ ๋น์ด ์์ผ๋ฉด ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
print(peek(queue)) # ์ถ๋ ฅ: 5
ํ์ ํฌ๊ธฐ ํ์ธ(Size)
Size ์ฐ์ฐ์ ํ์ ํ์ฌ ์ ์ฅ๋ ์์์ ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์ ํฌ๊ธฐ๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
# ํ์ ํฌ๊ธฐ ํ์ธ(Size)
queue_size = len(queue) # ํ์ ํ์ฌ ํฌ๊ธฐ๋ฅผ ๋ฐํํฉ๋๋ค.
print(queue_size) # ์ถ๋ ฅ: 1
03. ํ์ ์ข ๋ฅ๐งฉ
ํ๋ ๋ค์ํ ํํ๋ก ์กด์ฌํ๋ฉฐ, ๊ฐ๊ธฐ ๋ค๋ฅธ ํน์ฑ๊ณผ ์ฉ๋๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ฒ ์น์ ์์๋ ํ์ ์ฃผ์ ์ข ๋ฅ์ ๊ทธ ํน์ง์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ์ ์ ์ถ(FIFO) ํ
์ ์ ์ ์ถ ํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ์ ํ์ ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ์ผ์์ํ์์ ๋ง์ด ๋ณผ ์ ์๋ ์ค ์๊ธฐ ์์คํ ๊ณผ ์ ์ฌํฉ๋๋ค. FIFO ํ๋ ์ฝ์ ์ฐ์ฐ๊ณผ ์ญ์ ์ฐ์ฐ์ด ์ผ์ด๋๋ฉฐ, ์ฝ์ ์ฐ์ฐ์ ํ์ ๋ค์์ ์ด๋ฃจ์ด์ง๊ณ , ์ญ์ ์ฐ์ฐ์ ํ์ ์์์ ์ด๋ฃจ์ด์ง๋๋ค.
ํ์ ๊ธฐ๋ณธ ์๋ฆฌ์ ์๋ ๋ฐฉ์
์ ์ ์ ์ถ ํ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฝ์ (Enqueue): ์๋ก์ด ๋ฐ์ดํฐ๋ ํญ์ ํ์ ๋ค(rear)์์ ์ถ๊ฐ๋ฉ๋๋ค.
- ์ญ์ (Dequeue): ๋ฐ์ดํฐ๋ ํญ์ ํ์ ์(front)์์ ์ ๊ฑฐ๋๊ณ ๋ฐํ๋ฉ๋๋ค.
ํ์ด์ฌ์์ ์ ์ ์ ์ถ ํ ๊ตฌํํ๊ธฐ
ํ์ด์ฌ์์๋ collections ๋ชจ๋์ deque ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ์ ์ถ ํ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
from collections import deque
queue = deque()
# ์ฝ์
(Enqueue)
queue.append('a')
queue.append('b')
# ์ญ์ (Dequeue)
queue.popleft() # 'a'
queue.popleft() # 'b'
์ด ์์ ์์๋ deque ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฅผ ์์ฑํ๊ณ , append() ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ฉฐ, popleft() ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
์ ์
์ ์ถ ํ์ ํ์ฉ ์์
์ ์ ์ ์ถ ํ๋ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋ฉ๋๋ค. ๋ช ๊ฐ์ง ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ ์ค์ผ์ค๋ง: ์ด์์ฒด์ ์์ ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์ค๋งํ ๋, ๋จผ์ ์์ฒญ๋ ์์ ์ด ๋จผ์ ์ฒ๋ฆฌ๋๋๋ก ํ๋ ๋ฐฉ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- ํ๋ฆฐํฐ ๋๊ธฐ์ด: ํ๋ฆฐํฐ๋ ์์ฒญ๋ ์์๋๋ก ๋ฌธ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ ์ ์ ์ ์ถ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ์ถ๋ ฅ ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ๋คํธ์ํฌ ํจํท ์ฒ๋ฆฌ: ๋ผ์ฐํฐ๋ ๋คํธ์ํฌ ํจํท์ ์์๋๋ก ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ด๋ ์ ์ ์ ์ถ ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ: BFS(Breadth-First Search) ์๊ณ ๋ฆฌ์ฆ์์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ ธ๋๋ฅผ ์์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์ํ ํ(์ํ ํ)
์ํ ํ๋ ์ผ๋ฐ์ ์ธ ์ ์
์ ์ถ(FIFO) ํ์ ๋ฌธ์ ์ธ ๊ณต๊ฐ ๋ญ๋น๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ์
๋๋ค. ์ผ๋ฐ์ ์ธ ์ ์
์ ์ถ(FIFO) ํ์ ๋ฌ๋ฆฌ, ์ํ ํ๋ ํ์ ๋ง์ง๋ง ์์น์ ๋๋ฌํ๋ฉด ๋ค์ ์ฒ์ ์์น๋ก ๋์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ํ ํ์ ์๋ฆฌ๋ฅผ ์๊ธฐ ์ํด ๋จผ์ ์ ํ ํ์ ๋ฌธ์ ์ ๋ถํฐ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์ ํํ(Linear Queue)์ ๋ฌธ์ ์
์ ํํ๋ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ๊ตฌํ๋ ํ๋ก, ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ (enqueue) ๋บ ๋(dequeue) ๊ฐ๊ฐ์ ๋์์๋ง ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ์์ ๋ฐ์ํ ์ ์๋ ์ฃผ์ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ณต๊ฐ ๋ญ๋น: ์ ํํ์์ dequeue ์ฐ์ฐ์ ์ํํ ๋, ์์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ํ ๋จ์ ๊ณต๊ฐ์ ํ์ฉํ์ง ๋ชปํ๊ณ ๋จ๊ฒ ๋ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ ๊ณต๊ฐ์ด ์ค์ด๋ค์ด ๊ณต๊ฐ์ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ค๋ฒํ๋ก์ฐ ๋ฌธ์ : ํ์ ์๋ถ๋ถ์ด ๋น์์ง ํ์๋ ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์ถ๊ฐํ๊ฒ ๋๋ฉด, ๋ฐฐ์ด์ ๋์ ๋๋ฌํ๊ฒ ๋๋ฉด์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ํํ(Circular Queue)์ ์๋ฆฌ
์ํํ๋ ์ ํํ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์๋ฃ๊ตฌ์กฐ๋ก, ๋ฐฐ์ด์ ์ํ์ผ๋ก ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ฉด์ ์ ์ฅํ๋ ๋ฐฉ์์ ๋๋ค. ์ํํ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋๋ค.
์ํ ํ์ ํน์ง
- ๋ฐฐ์ด ์ธ๋ฑ์ค ์ฒ๋ฆฌ: ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๋ ์ํ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ, ๋ฐฐ์ด์ ๋์ ๋๋ฌํ๋ฉด ๋ค์ ๋ฐฐ์ด์ ์ฒ์์ผ๋ก ๋์๊ฐ๋ ๋ฐฉ์์ ์ทจํฉ๋๋ค. ์ด๋ ์ํํ์ ์ฅ์ ์ผ๋ก, ๊ณต๊ฐ์ ํจ์จ์ฑ์ ๋์ด๋ฉฐ ์ค๋ฒํ๋ก์ฐ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ๊ณต๊ฐ ํ์ฉ: ํ์ ๋ง์ง๋ง ์์น์ ์ฒ์ ์์น๊ฐ ์ฐ๊ฒฐ๋์ด ์ํ ๊ตฌ์กฐ๋ฅผ ์ด๋ฃน๋๋ค. ์ํํ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์, ํ์ ์์ชฝ์ด ๋น์์ ธ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์์ด ๊ณต๊ฐ ํ์ฉ์ด ํจ์จ์ ์ ๋๋ค.
- ํฌ์ธํฐ ์ฌ์ฉ: ์ํํ๋ front์ rear๋ผ๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๋ฐฐ์ด์ ๊ด๋ฆฌํฉ๋๋ค. front๋ ๋ฐ์ดํฐ๊ฐ ์ ๊ฑฐ๋๋ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ , rear๋ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ ์์น๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ํ ํ์ ์ฐ์ฐ
- ์ฝ์ (Enqueue): ๋ฐ์ดํฐ๋ฅผ ํ์ ๋ค์ชฝ(rear)์ ์ฝ์ ํฉ๋๋ค.
- ์ญ์ (Dequeue): ๋ฐ์ดํฐ๋ฅผ ํ์ ์์ชฝ(front)์์ ์ญ์ ํ๊ณ ๋ฐํํฉ๋๋ค.
- ํ๋ก ํธ(Front): ํ์ ๊ฐ์ฅ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํฉ๋๋ค.
- ํ๋ฐฉ(Rear): ํ์ ๊ฐ์ฅ ๋ค์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํฉ๋๋ค.
- ๋น ์ํ ํ์ธ: ํ๊ฐ ๋น์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๊ฝ ์ฐฌ ์ํ ํ์ธ: ํ๊ฐ ๊ฐ๋ ์ฐฌ ์ํ์ธ์ง ํ์ธํฉ๋๋ค.
ํ์ด์ฌ์์ ์ํ ํ ๊ตฌํํ๊ธฐ
ํ์ด์ฌ์์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ํ ํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋๋ ์ํ ํ์ ๊ตฌํ ์์ ์ ๋๋ค.
class CircularQueue:
def __init__(self, size):
self.size = size # ํ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค.
self.queue = [None] * size # ํฌ๊ธฐ๋งํผ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ์ฌ ํ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
self.front = self.rear = -1 # front์ rear๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
def is_full(self):
# rear ๋ค์ ์์น๊ฐ front์ธ ๊ฒฝ์ฐ ํ๊ฐ ๊ฐ๋ ์ฐฌ ์ํ์
๋๋ค.
return (self.rear + 1) % self.size == self.front
def is_empty(self):
# front์ rear๊ฐ ๋์ผํ ๊ฒฝ์ฐ ํ๊ฐ ๋น์ด ์๋ ์ํ์
๋๋ค.
return self.front == -1
def enqueue(self, data):
if self.is_full():
print("Queue is full")
elif self.is_empty():
self.front = self.rear = 0 # ํ๊ฐ ๋น์ด ์๋ ๊ฒฝ์ฐ front์ rear๋ฅผ 0์ผ๋ก ์ค์ ํฉ๋๋ค.
self.queue[self.rear] = data
else:
self.rear = (self.rear + 1) % self.size # rear๋ฅผ ๋ค์ ์์น๋ก ์ด๋ํฉ๋๋ค.
self.queue[self.rear] = data
def dequeue(self):
if self.is_empty():
print("Queue is empty")
return None
elif self.front == self.rear:
temp = self.queue[self.front]
self.front = self.rear = -1 # ํ์ ํ๋์ ์์๋ง ๋จ์ ์๋ ๊ฒฝ์ฐ front์ rear๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
return temp
else:
temp = self.queue[self.front]
self.front = (self.front + 1) % self.size # front๋ฅผ ๋ค์ ์์น๋ก ์ด๋ํฉ๋๋ค.
return temp
def front(self):
if self.is_empty():
print("Queue is empty")
return None
return self.queue[self.front]
def rear(self):
if self.is_empty():
print("Queue is empty")
return None
return self.queue[self.rear]
# ์ฌ์ฉ ์์
cq = CircularQueue(3) # ํฌ๊ธฐ๊ฐ 3์ธ ํํ ํ๋ฅผ ์์ฑํฉ๋๋ค.
# ํ์ ๋ฐ์ดํฐ ์ฝ์
cq.enqueue(1)
cq.enqueue(2)
cq.enqueue(3)
# ํ๊ฐ ๊ฐ๋ ์ฐฌ ์ํ ํ์ธ
print(cq.is_full()) # ์ถ๋ ฅ: True
# ํ์์ ๋ฐ์ดํฐ ์ญ์
print(cq.dequeue()) # ์ถ๋ ฅ: 1
# ํ์ ๋ฐ์ดํฐ ์ฝ์
cq.enqueue(4)
# ํ์ ํ์ฌ ์ํ ์ถ๋ ฅ
print(cq.queue) # ์ถ๋ ฅ: [4, 2, 3]
# ํ์ front์ rear ์์ ํ์ธ
print("Front element:", cq.queue[cq.front]) # ์ถ๋ ฅ: Front element: 2
print("Rear element:", cq.queue[cq.rear]) # ์ถ๋ ฅ: Rear element: 4
์ด ์์ ์์๋ CircularQueue ํด๋์ค๋ฅผ ์ ์ํ์ฌ ํํ ํ๋ฅผ ๊ตฌํํ์ต๋๋ค. ์ฃผ์ ์ฐ์ฐ์ผ๋ก๋ enqueue(), dequeue(), is_full(), is_empty(), front(), rear()๊ฐ ์์ต๋๋ค.
์ํ ํ์ ํ์ฉ ์์
์ํ ํ๋ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ ์ค์ผ์ค๋ง: ํ๋ก์ธ์์์ ๋ฐ๋ณต์ ์ธ ์์ ์ ๊ด๋ฆฌํ ๋ ํํ ํ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์ํ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ๋ฒํผ: ๋คํธ์ํฌ ์ฅ์น์์ ๋ฐ์ดํฐ ํจํท์ ์ํ์ ์ผ๋ก ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ผ์ด๋ ๋ก๋น ์ค์ผ์ค๋ง: ์ด์์ฒด์ ์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ฅผ ๊ณต์ ํ๊ฒ ์ค์ผ์ค๋งํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ฐ์ ์์ ํ
์ฐ์ ์์ ํ(Priority Queue)๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๊ณ , ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋ฎ์ ๋ฐ์ดํฐ๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋๋ ์๋ฃ๊ตฌ์กฐ์
๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ ํ(Queue)์ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ์์๊ฐ ์๋๋ผ ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ์ด์ฌ์์๋ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ heapq ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. heapq ๋ชจ๋์ ์ต์ ํ(min-heap)์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ฉฐ, ์ต๋ ํ(max-heap)์ ๊ตฌํํ ๋๋ ์ฐ์ ์์์ ๋ถํธ๋ฅผ ๋ฐ๊ฟ์ ํ์ฉํฉ๋๋ค.
import heapq # heapq ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค.
class PriorityQueue:
def __init__(self):
self.queue = [] # ๋น ํ๋ฅผ ์์ฑํฉ๋๋ค.
self.index = 0 # ์ฐ์ ์์๊ฐ ๋์ผํ ๊ฒฝ์ฐ๋ฅผ ์ํ ์ธ๋ฑ์ค๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
def enqueue(self, item, priority):
# ์ฐ์ ์์๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด ์์ ์ฐ์ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
heapq.heappush(self.queue, (-priority, self.index, item))
self.index += 1 # ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
def dequeue(self):
if not self.is_empty():
return heapq.heappop(self.queue)[-1] # ๊ฐ์ฅ ๋์ ์ฐ์ ์์์ ํญ๋ชฉ์ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
else:
return "Priority Queue is empty"
def is_empty(self):
return len(self.queue) == 0 # ํ๊ฐ ๋น์ด ์๋์ง ํ์ธํฉ๋๋ค.
# ์ฌ์ฉ ์์
pq = PriorityQueue() # ์ฐ์ ์์ ํ๋ฅผ ์์ฑํฉ๋๋ค.
pq.enqueue("task1", 1) # ์ฐ์ ์์๊ฐ 1์ธ ์์
์ ์ถ๊ฐํฉ๋๋ค.
pq.enqueue("task2", 2) # ์ฐ์ ์์๊ฐ 2์ธ ์์
์ ์ถ๊ฐํฉ๋๋ค.
print(pq.dequeue()) # ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์์
์ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
print(pq.dequeue()) # ๋ค์ ์ฐ์ ์์๊ฐ ๋์ ์์
์ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
print(pq.dequeue()) # ํ๊ฐ ๋น์ด ์์์ ๋ฐํํฉ๋๋ค.
์ด์ค ๋ ํ(Deque)
์ด์ค ๋ ํ(Deque, Double-ended Queue) ์ฆ ๋ฑ์ ์์ชฝ ๋์์ ์ฝ์
๊ณผ ์ญ์ ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ ํ์
๋๋ค.
์ด์ค ๋ ํ๋ ์ผ๋ฐ์ ์ธ ํ์ ๋ฌ๋ฆฌ ์์ชฝ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๊ณ ์ญ์ ํ ์ ์์ด ๋ ์ ์ฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. Python์์๋ collections ๋ชจ๋์ deque ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Deque๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
Deque์ ์ฃผ์ ์ฐ์ฐ
๋ค์์ collections.deque๋ฅผ ์ฌ์ฉํ Deque์ ์ฃผ์ ์ฐ์ฐ๊ณผ ๊ทธ ์์ ์ ๋๋ค:
1. ์ฝ์ ์ฐ์ฐ
- append(): Deque์ ๋ค์ชฝ์ ์์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- appendleft(): Deque์ ์์ชฝ์ ์์๋ฅผ ์ถ๊ฐํฉ๋๋ค.
from collections import deque # collections ๋ชจ๋์์ deque ํด๋์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
d = deque() # ๋น deque๋ฅผ ์์ฑํฉ๋๋ค.
# ๋ค์ชฝ์์ ์ฝ์
(append)
d.append(1) # Deque์ ๋ค์ชฝ์ 1์ ์ถ๊ฐํฉ๋๋ค.
d.append(2) # Deque์ ๋ค์ชฝ์ 2๋ฅผ ์ถ๊ฐํฉ๋๋ค.
print(d) # ์ถ๋ ฅ: deque([1, 2])
# ์์ชฝ์์ ์ฝ์
(appendleft)
d.appendleft(3) # Deque์ ์์ชฝ์ 3์ ์ถ๊ฐํฉ๋๋ค.
print(d) # ์ถ๋ ฅ: deque([3, 1, 2])
2. ์ญ์ ์ฐ์ฐ
- pop(): Deque์ ๋ค์ชฝ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
- popleft(): Deque์ ์์ชฝ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
# ๋ค์ชฝ์์ ์ญ์ (pop)
last_element = d.pop() # Deque์ ๋ค์ชฝ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
print(last_element) # ์ถ๋ ฅ: 2
print(d) # ์ถ๋ ฅ: deque([3, 1])
# ์์ชฝ์์ ์ญ์ (popleft)
first_element = d.popleft() # Deque์ ์์ชฝ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
print(first_element) # ์ถ๋ ฅ: 3
print(d) # ์ถ๋ ฅ: deque([1])
3. ๋งจ ์์ ์์ ํ์ธ(Peek)
# ๋งจ ์์ ์์ ํ์ธ
first_element = d[0] # Deque์ ๋งจ ์ ์์๋ฅผ ํ์ธํฉ๋๋ค.
print(first_element) # ์ถ๋ ฅ: 1
4. ๋งจ ๋ค์ ์์ ํ์ธ
# ๋งจ ๋ค์ ์์ ํ์ธ
last_element = d[-1] # Deque์ ๋งจ ๋ค ์์๋ฅผ ํ์ธํฉ๋๋ค.
print(last_element) # ์ถ๋ ฅ: 1
5. Deque์ ํฌ๊ธฐ ํ์ธ
# Deque์ ํฌ๊ธฐ ํ์ธ
deque_size = len(d) # Deque์ ํ์ฌ ํฌ๊ธฐ๋ฅผ ๋ฐํํฉ๋๋ค.
print(deque_size) # ์ถ๋ ฅ: 1
6. Deque์ ๋น ์ํ ํ์ธ
# Deque๊ฐ ๋น์ด ์๋์ง ํ์ธ
is_empty = len(d) == 0 # Deque์ ๊ธธ์ด๊ฐ 0์ธ์ง ํ์ธํ์ฌ ๋น ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
print(is_empty) # ์ถ๋ ฅ: False
์ด์ฒ๋ผ deque๋ ์์ชฝ ๋์์ ์ฝ์
๊ณผ ์ญ์ ๋ฅผ ๋ชจ๋ ์ง์ํ์ฌ ์ ์ฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ถ์ Deque๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌธ์ ํด๊ฒฐ์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
04. ํ์ด์ฌ์์ ํ ๊ตฌํ ๋ฐฉ๋ฒ๐ป
ํ์ด์ฌ์์ ํ(Queue)๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง, ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ํ ๊ตฌํ
๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ํ ๊ตฌํ์ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ค๋ง, ๋ฆฌ์คํธ์ ๋งจ ์์์ ์์๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ(pop(0))์ ์๊ฐ๋ณต์ก๋๊ฐ O(n)์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ์์๊ฐ ๋ค์ด์๋ ํ์์๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
class Queue:
def __init__(self):
"""ํ ์ด๊ธฐํ"""
self.items = [] # ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ํ ๊ตฌํ
def enqueue(self, item):
"""ํ์ ์์ ์ถ๊ฐ"""
self.items.append(item) # ๋ฆฌ์คํธ์ ๋์ ์์ ์ถ๊ฐ (enqueue)
def dequeue(self):
"""ํ์์ ์์ ์ญ์ ๋ฐ ๋ฐํ"""
if not self.is_empty():
return self.items.pop(0) # ๋ฆฌ์คํธ์ ๋งจ ์์์ ์์ ์ญ์ ๋ฐ ๋ฐํ (dequeue)
else:
return None
def is_empty(self):
"""ํ๊ฐ ๋น์ด์๋์ง ํ์ธ"""
return len(self.items) == 0
def size(self):
"""ํ์ ํฌ๊ธฐ ๋ฐํ"""
return len(self.items)
์์ ์ฝ๋์์ enqueue ๋ฉ์๋๋ ํ์ ๋์ ์์๋ฅผ ์ถ๊ฐํ๊ณ (append) dequeue ๋ฉ์๋๋ ํ์ ๋งจ ์์์ ์์๋ฅผ ์ญ์ ํ๊ณ ๋ฐํํฉ๋๋ค(pop(0)). is_empty ๋ฉ์๋๋ ํ๊ฐ ๋น์ด์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , size ๋ฉ์๋๋ ํ์ ๊ธธ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
collections.deque์ ์ด์ฉํ ํ ๊ตฌํ
๋ฑ(deque)์ ์์ชฝ ๋์์ O(1) ์๊ฐ๋ณต์ก๋๋ก ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ๋ฐ๋ผ์ ๋งค์ฐ ํจ์จ์ ์ธ ํ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋๋ค.
from collections import deque
class Queue:
def __init__(self):
"""ํ ์ด๊ธฐํ"""
self.items = deque() # deque์ ์ด์ฉํ์ฌ ํ ๊ตฌํ
def enqueue(self, item):
"""ํ์ ์์ ์ถ๊ฐ"""
self.items.append(item) # deque์ ์ค๋ฅธ์ชฝ์ ์์ ์ถ๊ฐ (enqueue)
def dequeue(self):
"""ํ์์ ์์ ์ญ์ ๋ฐ ๋ฐํ"""
if not self.is_empty():
return self.items.popleft() # deque์ ์ผ์ชฝ์์ ์์ ์ญ์ ๋ฐ ๋ฐํ (dequeue)
else:
return None
def is_empty(self):
"""ํ๊ฐ ๋น์ด์๋์ง ํ์ธ"""
return len(self.items) == 0
def size(self):
"""ํ์ ํฌ๊ธฐ ๋ฐํ"""
return len(self.items)
์ด ๊ฒฝ์ฐ์๋ enqueue ๋ฉ์๋๋ ๋ฑ์ ์ค๋ฅธ์ชฝ์ ์์๋ฅผ ์ถ๊ฐํ๊ณ (append) dequeue ๋ฉ์๋๋ ๋ฑ์ ์ผ์ชฝ์์ ์์๋ฅผ ์ญ์ ํ๊ณ ๋ฐํํฉ๋๋ค(popleft). ๋๋จธ์ง ๋ฉ์๋๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๊ตฌํ๊ณผ ๋์ผํฉ๋๋ค.
# ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ํ ์ฌ์ฉ ์์
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue()) # ์ถ๋ ฅ: 1
print(q.size()) # ์ถ๋ ฅ: 2
# deque๋ฅผ ์ด์ฉํ ํ ์ฌ์ฉ ์์
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue()) # ์ถ๋ ฅ: 1
print(q.size()) # ์ถ๋ ฅ: 2
์ด์ ๊ฐ์ด ํ์ด์ฌ์์๋ ๋ฆฌ์คํธ๋ ๋ฑ์ ์ด์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฉด์์ ๋ ์ฐ์ํ๋ฉฐ, ๋๋ถ๋ถ์ ์ํฉ์์ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
05. ํ์ ํ์ฉ ์์๐
ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ์ ์ฅํ๊ณ , ๊ทธ ์์๋๋ก ์ฒ๋ฆฌํด์ผ ํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์๋ ์์๋ค์ ํ๊ฐ ๋ค์ํ ๋ถ์ผ์์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. BFS ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ๋ถํฐ ์์ ์ฒ๋ฆฌ, ๋ฒํผ ๊ด๋ฆฌ๊น์ง ๋ค์ํ ์ํฉ์์ ํ๊ฐ ํ์์ ์ธ ์๋ฃ๊ตฌ์กฐ์์ ๋ณด์ฌ์ค๋๋ค.
์์ ์ฒ๋ฆฌ ํ ์์
์ปดํจํฐ ์์คํ ์์ ์์ ์ด ๋ค์ด์ค๋ฉด ์ฒ๋ฆฌํ ๋ ํ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ฆฐํฐ ํ์์๋ ์ธ์ ์์ฒญ์ด ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ํ, ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์์ ํ๋ ํ์ ๊ฐ๋ ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ์ ์์ต๋๋ค.
from collections import deque
def bfs(graph, start):
visited = set() # ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ถ์ ํฉ๋๋ค.
queue = deque([start]) # ์์ ๋
ธ๋๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
while queue:
vertex = queue.popleft() # ํ์ ์์์ ๋
ธ๋๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
if vertex not in visited:
visited.add(vertex) # ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์ํฉ๋๋ค.
queue.extend(graph[vertex] - visited) # ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
return visited
# ์์ ๊ทธ๋ํ
graph = {
'A': {'B', 'C'},
'B': {'A', 'D', 'E'},
'C': {'A', 'F'},
'D': {'B'},
'E': {'B', 'F'},
'F': {'C', 'E'}
}
print(bfs(graph, 'A')) # ์ถ๋ ฅ: {'A', 'B', 'C', 'D', 'E', 'F'}
BFS (๋๋น ์ฐ์ ํ์)
๊ทธ๋ํ์์ ๋๋น ์ฐ์ ํ์(Breadth-First Search, BFS) ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. BFS๋ ๊ฐ์ ๋ ๋ฒจ์ ๋ ธ๋๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ ํ ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ํ๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ ํฉํฉ๋๋ค.
from collections import deque
def bfs(graph, start_node):
"""๋๋น ์ฐ์ ํ์(BFS) ์๊ณ ๋ฆฌ์ฆ"""
visited = []
queue = deque([start_node])
while queue:
node = queue.popleft()
if node not in visited:
visited.append(node)
queue.extend(graph[node])
return visited
# ๊ทธ๋ํ์ ์์ ๋
ธ๋ ์ ์
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
start_node = 'A'
print(bfs(graph, start_node)) # ์ถ๋ ฅ: ['A', 'B', 'C', 'D', 'E', 'F']
๋ฒํผ ๊ด๋ฆฌ
์ ์ถ๋ ฅ ์๋๊ฐ ๋ค๋ฅธ ์์คํ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ง ํ ๋ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ ์์๋๋ก ๋ฒํผ์ ์ ์ฅํ๊ณ , ์ฒ๋ฆฌ ์๋์ ๋ง๊ฒ ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
from collections import deque
import time
class Buffer:
def __init__(self, capacity):
"""๋ฒํผ ์ด๊ธฐํ"""
self.buffer = deque()
self.capacity = capacity
def add_data(self, data):
"""๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ์ถ๊ฐ"""
if len(self.buffer) < self.capacity:
self.buffer.append(data)
else:
print("Buffer is full. Unable to add data.")
def process_data(self):
"""๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ ์ฒ๋ฆฌ"""
if self.buffer:
return self.buffer.popleft()
else:
print("Buffer is empty. No data to process.")
# ๋ฒํผ ์ฌ์ฉ ์์
buffer = Buffer(capacity=3)
for i in range(5):
buffer.add_data(f"Data {i}")
while True:
data = buffer.process_data()
if data:
print(f"Processing: {data}")
time.sleep(1) # ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฎฌ๋ ์ด์
์ ์ํ sleep
else:
break
06. ํ์ ์ฅ๋จ์ โ๏ธ
์ฅ์
- ์์ ๋ณด์ฅ: ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ์ ์ ์ฉํ๊ฒ ํ์ฉ๋ฉ๋๋ค.
- ๊ตฌํ์ด ๊ฐ๋จ: ๊ธฐ๋ณธ์ ์ธ ํ์ ๊ตฌํ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ฆฌ์คํธ๋ ๋ฑ์ ์ด์ฉํ์ฌ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋๋น ์ฐ์ ํ์(BFS) ๊ตฌํ: ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์์ ๋๋น ์ฐ์ ํ์(BFS)์ ๊ตฌํํ ๋ ํ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. BFS๋ ํ์ ์๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ๊ฐ์ ๋ ๋ฒจ์ ๋ ธ๋๋ค์ ๋จผ์ ํ์ํ๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ: ๋ฐ์ดํฐ๊ฐ ๊ณ์์ ์ผ๋ก ๋ค์ด์ค๊ณ , ์ผ์ ํ ์๋๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ ๋ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฒํผ ๊ด๋ฆฌ๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์ ์ ์ฉํฉ๋๋ค.
๋จ์
- ์ ์ฅ ๊ณต๊ฐ์ ํ๊ณ: ๋ฐฐ์ด ๊ธฐ๋ฐ์ ํ ๊ตฌํ์์๋ ์ ์ฅ ๊ณต๊ฐ์ ํฌ๊ธฐ๊ฐ ์ ํ๋์ด ์์ด์, ๋ฐ์ดํฐ๊ฐ ๋ง์ด ์์ผ ๊ฒฝ์ฐ ์ค๋ฒํ๋ก์ฐ(Overflow)๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ฝ์ ๋ฐ ์ญ์ ์ฐ์ฐ์ ์๊ฐ๋ณต์ก๋: ์ผ๋ฐ์ ์ผ๋ก ํ์์๋ ๋ฐ์ดํฐ์ ์ฝ์ (enqueue) ๋ฐ ์ญ์ (dequeue) ์ฐ์ฐ์ด ์์ ์๊ฐ O(1)์ ์ํ๋ฉ๋๋ค. ํ์ง๋ง ๋ฐฐ์ด ๊ธฐ๋ฐ์ ํ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋๋ง๋ค ๋ค๋ฅธ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ์นธ์ฉ ์์ผ๋ก ๋น๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ด, ์ต์ ์ ๊ฒฝ์ฐ์๋ O(n)์ ์๊ฐ์ด ์์๋ ์ ์์ต๋๋ค.
- ์ ๊ทผ์ ์ ํ: ํ๋ FIFO ์์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋, ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ถํฐ ์์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ํน์ ๋ฐ์ดํฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ฑฐ๋ ์ญ์ ํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ(์: ํด์๋งต)๋ฅผ ํจ๊ป ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
ํ๋ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ์ฒ๋ฆฌํด์ผ ํ ๋ ๋งค์ฐ ์ ์ฉํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ์ ์ ๊ทผ ํจํด์ด๋ ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฝ ๋ฑ์ ๊ณ ๋ คํ์ฌ ์ ์ ํ ์ ํํ๊ณ ์ฌ์ฉํด์ผ ํฉ๋๋ค. BFS์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ด๋ ๋ฐ์ดํฐ์ FIFO ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๊ณ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
08. ํต์ฌ ๋ด์ฉ๐