๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Knowledge/Data structure

[์ž๋ฃŒ๊ตฌ์กฐ]ํŒŒ์ด์ฌ ํ ์ž๋ฃŒ๊ตฌ์กฐ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ „ ํ™œ์šฉ๊นŒ์ง€

by YJ Dev 2024. 6. 19.
728x90
๋ฐ˜์‘ํ˜•
SMALL

ํ(Queue)๋Š” ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ, ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ์„ ์ž…์„ ์ถœ(FIFO, First In First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ๋Š” ์ผ์ƒ์ƒํ™œ์—์„œ๋„ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ์€ํ–‰์˜ ๋Œ€๊ธฐ ์ค„์ด ํ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํŒŒ์ด์ฌ์—์„œ ํ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ ์ž๋ฃŒ๊ตฌ์กฐ


01. ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ž€?๐Ÿ“š

ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํ(Queue)๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ๋Š” ์„ ์ž…์„ ์ถœ(FIFO, First In First Out) ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ, ์€ํ–‰์˜ ๋Œ€๊ธฐ ์ค„์ด๋‚˜ ๋ฒ„์Šค ์ •๋ฅ˜์žฅ์˜ ์ค„๊ณผ ๊ฐ™์€ ์ผ์ƒ์ƒํ™œ์—์„œ๋„ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

ํ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์™€ ์ž‘๋™ ๋ฐฉ์‹

ํ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์—ฐ์‚ฐ์ธ ์‚ฝ์ž…(Enqueue)๊ณผ ์‚ญ์ œ(Dequeue)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํ์˜ ๋’ค(rear)๋กœ ๋„ฃ๋Š” ๊ฒƒ์ด๊ณ , ์‚ญ์ œ ์—ฐ์‚ฐ์€ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ํ์˜ ์•ž(front)์—์„œ ๋นผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ํ†ตํ•ด ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰์˜ ๋Œ€๊ธฐ ์ค„์„ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์ƒˆ๋กœ์šด ๊ณ ๊ฐ์ด ์˜ค๋ฉด ์ค„์˜ ๋งจ ๋’ค์— ์„œ๊ฒŒ ๋˜๊ณ , ์ค„์˜ ๋งจ ์•ž์— ์žˆ๋Š” ๊ณ ๊ฐ์ด ๋จผ์ € ์ฐฝ๊ตฌ๋กœ ์ด๋™ํ•ด ์„œ๋น„์Šค๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ํ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์ฐจ๋ก€๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

ํ๋Š” ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ BFS(Breadth-First Search)์—์„œ ํ๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž‘์—… ์Šค์ผ€์ค„๋ง, ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ, ์›น ์„œ๋ฒ„ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค์ƒํ™œ ์‘์šฉ์—์„œ๋„ ํ๋Š” ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ์˜ ์ž๋ฃŒ๊ตฌ์กฐ


ํ์™€ ์Šคํƒ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”?

ํ๋Š” ์„ ์ž…์„ ์ถœ(FIFO) ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์Šคํƒ์€ ํ›„์ž…์„ ์ถœ(LIFO) ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์Šคํƒ์— ๊ด€ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”๐Ÿ˜

" "

[์ž๋ฃŒ๊ตฌ์กฐ]ํŒŒ์ด์ฌ ์Šคํƒ ๊ตฌ์กฐ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๊ฐœ๋…, ๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ์˜ˆ์ œ

ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ(Stack) ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ ‘๊ทผ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ, ํ›„์ž…์„ ์ถœ(LIFO: Last In, First Out) ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ์ด ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋˜๋Š” ๊ตฌ์กฐ๋กœ, ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ

creativevista.tistory.com


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 ํ๋Š” ์‚ฝ์ž… ์—ฐ์‚ฐ๊ณผ ์‚ญ์ œ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚˜๋ฉฐ, ์‚ฝ์ž… ์—ฐ์‚ฐ์€ ํ์˜ ๋’ค์—์„œ ์ด๋ฃจ์–ด์ง€๊ณ , ์‚ญ์ œ ์—ฐ์‚ฐ์€ ํ์˜ ์•ž์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.


ํ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์™€ ์ž‘๋™ ๋ฐฉ์‹

์„ ์ž…์„ ์ถœ ํ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์‚ฝ์ž…(Enqueue): ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ํ์˜ ๋’ค(rear)์—์„œ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  2. ์‚ญ์ œ(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() ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.


์„ ์ž…์„ ์ถœ ํ์˜ ํ™œ์šฉ ์˜ˆ์‹œ

์„ ์ž…์„ ์ถœ ํ๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์ž‘์—… ์Šค์ผ€์ค„๋ง: ์šด์˜์ฒด์ œ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„๋งํ•  ๋•Œ, ๋จผ์ € ์š”์ฒญ๋œ ์ž‘์—…์ด ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. ํ”„๋ฆฐํ„ฐ ๋Œ€๊ธฐ์—ด: ํ”„๋ฆฐํ„ฐ๋Š” ์š”์ฒญ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„ ์ž…์„ ์ถœ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ์ถœ๋ ฅ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  3. ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ์ฒ˜๋ฆฌ: ๋ผ์šฐํ„ฐ๋Š” ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋•Œ ์„ ์ž…์„ ์ถœ ํ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜: BFS(Breadth-First Search) ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์›ํ˜• ํ(์ˆœํ™˜ ํ)

์›ํ˜• ํ๋Š” ์ผ๋ฐ˜์ ์ธ ์„ ์ž…์„ ์ถœ(FIFO) ํ์˜ ๋ฌธ์ œ์ธ ๊ณต๊ฐ„ ๋‚ญ๋น„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์„ ์ž…์„ ์ถœ(FIFO) ํ์™€ ๋‹ฌ๋ฆฌ, ์›ํ˜• ํ๋Š” ํ์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์‹œ ์ฒ˜์Œ ์œ„์น˜๋กœ ๋Œ์•„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›ํ˜• ํ์˜ ์›๋ฆฌ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ๋จผ์ € ์„ ํ˜• ํ์˜ ๋ฌธ์ œ์  ๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ ํ˜•ํ(Linear Queue)์˜ ๋ฌธ์ œ์ 

์„ ํ˜•ํ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ ํ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ (enqueue) ๋บ„ ๋•Œ(dequeue) ๊ฐ๊ฐ์˜ ๋์—์„œ๋งŒ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ณต๊ฐ„ ๋‚ญ๋น„: ์„ ํ˜•ํ์—์„œ dequeue ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์•ž์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ ํ›„ ๋‚จ์€ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‚จ๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ์˜ ๊ณต๊ฐ„์ด ์ค„์–ด๋“ค์–ด ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฌธ์ œ: ํ์˜ ์•ž๋ถ€๋ถ„์ด ๋น„์›Œ์ง„ ํ›„์—๋„ ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฐฐ์—ด์˜ ๋์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์›ํ˜•ํ(Circular Queue)์˜ ์›๋ฆฌ

์›ํ˜•ํ๋Š” ์„ ํ˜•ํ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ๋ฐฐ์—ด์„ ์›ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํ™˜ํ•˜๋ฉด์„œ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์›ํ˜•ํ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.


์›ํ˜• ํ์˜ ํŠน์ง•

  1. ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์ฒ˜๋ฆฌ: ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์›ํ˜•์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๋ฐฐ์—ด์˜ ๋์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์‹œ ๋ฐฐ์—ด์˜ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์›ํ˜•ํ์˜ ์žฅ์ ์œผ๋กœ, ๊ณต๊ฐ„์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๋ฉฐ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ณต๊ฐ„ ํ™œ์šฉ: ํ์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜์™€ ์ฒ˜์Œ ์œ„์น˜๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์›ํ˜• ๊ตฌ์กฐ๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค. ์›ํ˜•ํ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ์˜ ์•ž์ชฝ์ด ๋น„์›Œ์ ธ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด ๊ณต๊ฐ„ ํ™œ์šฉ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  3. ํฌ์ธํ„ฐ ์‚ฌ์šฉ: ์›ํ˜•ํ๋Š” front์™€ rear๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ˜• ๋ฐฐ์—ด์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. front๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , rear๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.


์›ํ˜• ํ์˜ ์—ฐ์‚ฐ

  1. ์‚ฝ์ž…(Enqueue): ๋ฐ์ดํ„ฐ๋ฅผ ํ์˜ ๋’ค์ชฝ(rear)์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ญ์ œ(Dequeue): ๋ฐ์ดํ„ฐ๋ฅผ ํ์˜ ์•ž์ชฝ(front)์—์„œ ์‚ญ์ œํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ”„๋ก ํŠธ(Front): ํ์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ํ›„๋ฐฉ(Rear): ํ์˜ ๊ฐ€์žฅ ๋’ค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  5. ๋นˆ ์ƒํƒœ ํ™•์ธ: ํ๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  6. ๊ฝ‰ ์ฐฌ ์ƒํƒœ ํ™•์ธ: ํ๊ฐ€ ๊ฐ€๋“ ์ฐฌ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


ํŒŒ์ด์ฌ์—์„œ ์›ํ˜• ํ ๊ตฌํ˜„ํ•˜๊ธฐ

ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ˜• ํ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์›ํ˜• ํ์˜ ๊ตฌํ˜„ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

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()๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›ํ˜• ํ์˜ ํ™œ์šฉ ์˜ˆ์‹œ

์›ํ˜• ํ๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์ž‘์—… ์Šค์ผ€์ค„๋ง: ํ”„๋กœ์„ธ์„œ์—์„œ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ๊ด€๋ฆฌํ•  ๋•Œ ํ™˜ํ˜• ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆœํ™˜์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋„คํŠธ์›Œํฌ ๋ฒ„ํผ: ๋„คํŠธ์›Œํฌ ์žฅ์น˜์—์„œ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ์ˆœํ™˜์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  3. ๋ผ์šด๋“œ ๋กœ๋นˆ ์Šค์ผ€์ค„๋ง: ์šด์˜์ฒด์ œ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณต์ •ํ•˜๊ฒŒ ์Šค์ผ€์ค„๋งํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ

์šฐ์„ ์ˆœ์œ„ ํ(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. ํ์˜ ์žฅ๋‹จ์ โš–๏ธ

์žฅ์ 

  1. ์ˆœ์„œ ๋ณด์žฅ: ํ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. ๊ตฌํ˜„์ด ๊ฐ„๋‹จ: ๊ธฐ๋ณธ์ ์ธ ํ์˜ ๊ตฌํ˜„์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฑ์„ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS) ๊ตฌํ˜„: ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์„ ๊ตฌํ˜„ํ•  ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. BFS๋Š” ํ์˜ ์›๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋“ค์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ: ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์†์ ์œผ๋กœ ๋“ค์–ด์˜ค๊ณ , ์ผ์ •ํ•œ ์†๋„๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ๋•Œ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ„ํผ ๊ด€๋ฆฌ๋‚˜ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  1. ์ €์žฅ ๊ณต๊ฐ„์˜ ํ•œ๊ณ„: ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์˜ ํ ๊ตฌํ˜„์—์„œ๋Š” ์ €์žฅ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์–ด์„œ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ์Œ“์ผ ๊ฒฝ์šฐ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Overflow)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„: ์ผ๋ฐ˜์ ์œผ๋กœ ํ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…(enqueue) ๋ฐ ์‚ญ์ œ(dequeue) ์—ฐ์‚ฐ์ด ์ƒ์ˆ˜ ์‹œ๊ฐ„ O(1)์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์˜ ํ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์นธ์”ฉ ์•ž์œผ๋กœ ๋‹น๊ฒจ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด, ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” O(n)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ ‘๊ทผ์˜ ์ œํ•œ: ํ๋Š” FIFO ์›์น™์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ, ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ๋ฐ์ดํ„ฐ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ(์˜ˆ: ํ•ด์‹œ๋งต)๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

ํ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ ํŒจํ„ด์ด๋‚˜ ์ €์žฅ ๊ณต๊ฐ„์˜ ์ œ์•ฝ ๋“ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์ ์ ˆํžˆ ์„ ํƒํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. BFS์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์ด๋‚˜ ๋ฐ์ดํ„ฐ์˜ FIFO ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


08. ํ•ต์‹ฌ ๋‚ด์šฉ๐Ÿ‘€

728x90
๋ฐ˜์‘ํ˜•