๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ

์ž๋ฃŒ๊ตฌ์กฐ ํ•œ๋ฒˆ์— ์ •๋ฆฌ

by ๋ฝ€์งœ๊ผฌ 2025. 4. 30.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“‘ ์ž๋ฃŒ๊ตฌ์กฐ๋ž€?

๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ , ๊บผ๋‚ด๊ณ , ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์ด๋‹ค.


๐Ÿ“ฆ ๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ ์ด์ •๋ฆฌ

์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌ์กฐ ํŠน์ง• ๊บผ๋‚ด๋Š” ์ˆœ์„œ ์‚ฌ์šฉ ์˜ˆ์‹œ
๋ฐฐ์—ด (Array / List) ์„ ํ˜•๊ตฌ์กฐ, ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ ๋ฆฌ์ŠคํŠธ, ์ˆœํšŒ
์Šคํƒ (Stack) ํ•œ ์ชฝ ๋์—๋งŒ ๋„ฃ๊ณ  ๊บผ๋ƒ„ LIFO (๋‚˜์ค‘์— ๋„ฃ์€๊ฒŒ ๋จผ์ € ๋‚˜์˜ด) = ํ”„๋ง๊ธ€์Šค ํ†ต ๋˜๋Œ๋ฆฌ๊ธฐ(Undo), ๊ด„ํ˜ธ ๊ฒ€์‚ฌ
ํ (Queue) ํ•œ ์ชฝ์— ๋„ฃ๊ณ  ๋‹ค๋ฅธ์ชฝ์—์„œ ๊บผ๋ƒ„ FIFO (๋จผ์ € ๋„ฃ์€๊ฒŒ ๋จผ์ € ๋‚˜์˜ด / ์„ ์ž…์„ ์ถœ) = ํŒŒ์ดํ”„ BFS, ๋Œ€๊ธฐ์—ด
๋ฑ (Deque) ์–‘ ์ชฝ ๋์—์„œ ๋„ฃ๊ณ  ๊บผ๋‚ด๊ธฐ ๊ฐ€๋Šฅ ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ, ์–‘์ชฝ ํƒ์ƒ‰
ํž™ (Heap) ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ, ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๊ฐ’ ๋จผ์ € ๋‹ค์ต์ŠคํŠธ๋ผ, ์Šค์ผ€์ค„๋ง
ํŠธ๋ฆฌ (Tree) ๊ณ„์ธต๊ตฌ์กฐ, ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„ ์ˆœํšŒ ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ„ ํด๋” ๊ตฌ์กฐ, ํŠธ๋ฆฌ ํƒ์ƒ‰
๊ทธ๋ž˜ํ”„ (Graph) ์ •์ ๊ณผ ๊ฐ„์„  ๊ด€๊ณ„ DFS, BFS, ๋‹ค์ต์ŠคํŠธ๋ผ ๋“ฑ ๊ฒฝ๋กœ ํƒ์ƒ‰
ํ•ด์‹œ (HashMap / Dictionary) key → value key๋กœ ์ ‘๊ทผ ๋”•์…”๋„ˆ๋ฆฌ, ์นด์šดํŒ…

๐Ÿฅž ์Šคํƒ(Stack) - ๋Šฆ๊ฒŒ ๋“ค์–ด๊ฐ„๊ฑฐ ๋จผ์ €๋‚˜์˜ด

stack = []

# ๊ฐ’ ์ถ”๊ฐ€ (push)
stack.append(1)
stack.append(2)

# ๊ฐ’ ์ œ๊ฑฐ (pop)
print(stack.pop())  # โžœ 2
print(stack.pop())  # โžœ 1

๐Ÿชˆํ(Queue) - ์„ ์ž…์„ ์ถœ

๋’ค์—์„œ ๋„ฃ๊ณ , ์•ž์—์„œ ๊บผ๋‚ธ๋‹ค. / ํŒŒ์ดํ”„, ์ค„์„œ๊ธฐ ๋“ฑ

from collections import deque

queue = deque()

# ๊ฐ’ ์ถ”๊ฐ€ (enqueue)
queue.append(1)
queue.append(2)

# ๊ฐ’ ์ œ๊ฑฐ (dequeue)
print(queue.popleft())  # โžœ 1
print(queue.popleft())  # โžœ 2

๐Ÿ‘‘ ํž™(Heap) — ์šฐ์„ ์ˆœ์œ„ ๋†’์€๊ฑฐ ๋จผ์ €

๊ธฐ๋ณธ์€ ์ตœ์†Œํž™

import heapq

heap = []

# ๊ฐ’ ์ถ”๊ฐ€ (์ž๋™ ์ •๋ ฌ๋จ)
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)

# ์ตœ์†Ÿ๊ฐ’ ๊บผ๋‚ด๊ธฐ
print(heapq.heappop(heap))  # โžœ 1
print(heapq.heappop(heap))  # โžœ 2
print(heapq.heappop(heap))  # โžœ 3

๐ŸŒณ ํŠธ๋ฆฌ(Tree) — ๊ณ„์ธต์  ๊ตฌ์กฐ

class Node:
    def __init__(self, value):
        self.value = value
        self.children = []

# ํŠธ๋ฆฌ ์ƒ์„ฑ
root = Node(1)
child1 = Node(2)
child2 = Node(3)

root.children.append(child1)
root.children.append(child2)

# ์ˆœํšŒ ์˜ˆ์‹œ (DFS)
def dfs(node):
    print(node.value)
    for child in node.children:
        dfs(child)

dfs(root)

+) ํŠธ๋ฆฌ์™€ ๊ทธ๋ž˜ํ”„์˜ ์ฐจ์ด๋Š”?

  ํŠธ๋ฆฌ (Tree) ๊ทธ๋ž˜ํ”„ (Graph)
์ •์˜ ์‚ฌ์ดํด ์—†๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ (์ผ์ข…์˜ ๊ทธ๋ž˜ํ”„) **์ •์ (๋…ธ๋“œ)๊ณผ ๊ฐ„์„ (์—ฐ๊ฒฐ)**์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ
๋ฐฉํ–ฅ์„ฑ ๋ณดํ†ต ๋ฐฉํ–ฅ ์žˆ์Œ (๋ถ€๋ชจ → ์ž์‹) ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ / ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ชจ๋‘ ๊ฐ€๋Šฅ
๋ฃจํŠธ ๋ฐ˜๋“œ์‹œ 1๊ฐœ์˜ ๋ฃจํŠธ ๋…ธ๋“œ(root) ์žˆ์Œ ๋ฃจํŠธ ์—†์Œ (๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋Œ€๋“ฑํ•  ์ˆ˜ ์žˆ์Œ)
์‚ฌ์ดํด โŒ ์—†์Œ (์ˆœํ™˜ ๋ถˆ๊ฐ€) โœ… ์žˆ์„ ์ˆ˜ ์žˆ์Œ (์˜ˆ: A → B → A)
๊ฒฝ๋กœ ์ˆ˜ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด ๊ฒฝ๋กœ๋Š” 1๊ฐœ๋ฟ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ ๊ฐ€๋Šฅ
์˜ˆ์‹œ ํด๋” ๊ตฌ์กฐ, ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„, SNS ์นœ๊ตฌ ๊ด€๊ณ„

 

์Šคํƒ, ํ, ํž™, ํŠธ๋ฆฌ ์ •๋ฆฌ

๊ตฌ์กฐ ์‚ฝ์ž… ๊บผ๋‚ด๊ธฐ ์ˆœ์„œ
์Šคํƒ ์œ„์— ๋„ฃ์Œ ์œ„์—์„œ ๊บผ๋ƒ„ LIFO
ํ ๋’ค์— ๋„ฃ์Œ ์•ž์—์„œ ๊บผ๋ƒ„ FIFO
ํž™ ์•„๋ฌด๋ฐ๋‚˜ ๋„ฃ์Œ ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ๊บผ๋ƒ„ ๊ฐ’ ๊ธฐ์ค€
ํŠธ๋ฆฌ ๋ถ€๋ชจ → ์ž์‹ ์—ฐ๊ฒฐ ํƒ์ƒ‰ ๋ฐฉ์‹ ๋”ฐ๋ผ ๋‹ค๋ฆ„ ๊ณ„์ธต ๊ตฌ์กฐ
728x90
๋ฐ˜์‘ํ˜•