๊ด€๋ฆฌ ๋ฉ”๋‰ด

GW LABS

๐Ÿ“Œ ์ž๋ฃŒ๊ตฌ์กฐ ์น˜ํŠธ์‹œํŠธ: ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„ ์™„๋ฒฝ ์ •๋ฆฌ ๋ณธ๋ฌธ

Programming

๐Ÿ“Œ ์ž๋ฃŒ๊ตฌ์กฐ ์น˜ํŠธ์‹œํŠธ: ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„ ์™„๋ฒฝ ์ •๋ฆฌ

GeonWoo Kim 2025. 8. 10. 15:30

๐Ÿ“Œ ์ž๋ฃŒ๊ตฌ์กฐ ์น˜ํŠธ์‹œํŠธ: ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„ ์™„๋ฒฝ ์ •๋ฆฌ

์„œ๋ก 

์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ์ขŒ์šฐํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ๋ผ๋„ ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋ฐฐ์—ด, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ํ•ด์‹œ ํ…Œ์ด๋ธ”, ์Šคํƒ, ํ, ๋ฐํฌ, ํŠธ๋ฆฌ, ์ด์ง„ ํŠธ๋ฆฌ, ํž™, ๊ทธ๋ž˜ํ”„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ, ๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ๊ณผ ์‹œ๊ฐ„·๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ์น˜ํŠธ์‹œํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ธ€์„ ์ฝ๊ณ  ๋‚˜๋ฉด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฟ ์•„๋‹ˆ๋ผ ์‹ค๋ฌด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ตœ์ ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ ๊ฐ–์ถ”๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋ณธ๋ก 

1. ์ฃผ์š” ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐœ์š” ๋ฐ ์‹œ๊ฐ„·๊ณต๊ฐ„ ๋ณต์žก๋„

๋‹ค์Œ ํ‘œ๋Š” ๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ‰๊ท ์ ์ธ ์—ฐ์‚ฐ ๋ณต์žก๋„๋ฅผ ์š”์•ฝํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ ์ ‘๊ทผ(Access) ๊ฒ€์ƒ‰(Search) ์‚ฝ์ž…(Insert) ์‚ญ์ œ(Delete) ๊ณต๊ฐ„๋ณต์žก๋„
๋ฐฐ์—ด(Array) O(1) O(n) O(n) O(n) O(n)
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List) O(n) O(n) O(1) (head/tail ๊ธฐ์ค€) O(1) (head/tail ๊ธฐ์ค€) O(n)
ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table) N/A O(1) (ํ‰๊ท ) / O(n) (์ตœ์•…) O(1) / O(n) O(1) / O(n) O(n)
์Šคํƒ(Stack) O(n) O(n) O(1) O(1) O(n)
ํ(Queue) O(n) O(n) O(1) O(1) O(n)
๋ฐํฌ(Deque) O(n) O(n) O(1) O(1) O(n)
ํŠธ๋ฆฌ(Tree) O(log n) O(log n) O(log n) O(log n) O(n)
์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(BST, Balanced) O(log n) O(log n) O(log n) O(log n) O(n)
ํž™(Heap) O(n) O(n) O(log n) O(log n) O(n)
๊ทธ๋ž˜ํ”„(Graph) O(1)~O(n) O(1)~O(n) O(1)~O(n) O(1)~O(n) O(V+E)

2. ์ž๋ฃŒ๊ตฌ์กฐ๋ณ„ ํŠน์ง•๊ณผ ์˜ˆ์ œ ์ฝ”๋“œ

๐Ÿ“Œ ๋ฐฐ์—ด (Array)

  • ํŠน์ง•: ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ํฌ๊ธฐ ๊ณ ์ •(์–ธ์–ด์— ๋”ฐ๋ผ ๋™์  ๋ฐฐ์—ด ์ง€์›).
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •์ ์ด๊ณ  ๋น ๋ฅธ ๋žœ๋ค ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ.
# ํŒŒ์ด์ฌ ๋ฐฐ์—ด(๋ฆฌ์ŠคํŠธ) ์˜ˆ์ œ
arr = [1, 2, 3]
arr.append(4)   # O(1) ํ‰๊ท 
arr.insert(1, 5)  # O(n)
print(arr[2])   # O(1)

๐Ÿ“Œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Linked List)

  • ํŠน์ง•: ๋…ธ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์  ํฌ๊ธฐ ์กฐ์ ˆ ๊ฐ€๋Šฅ, ์‚ฝ์ž…/์‚ญ์ œ O(1) (์œ„์น˜ ์•Œ๊ณ  ์žˆ์„ ๊ฒฝ์šฐ), ๋žœ๋ค ์ ‘๊ทผ ๋ถˆ๊ฐ€.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ.
// Java LinkedList ์˜ˆ์ œ
import java.util.LinkedList;

LinkedList<Integer> list = new LinkedList<>();
list.addFirst(1); // O(1)
list.addLast(2);  // O(1)
list.removeFirst(); // O(1)

๐Ÿ“Œ ํ•ด์‹œ ํ…Œ์ด๋ธ” (Hash Table)

  • ํŠน์ง•: ํ‰๊ท ์ ์œผ๋กœ O(1) ๊ฒ€์ƒ‰·์‚ฝ์ž…·์‚ญ์ œ, ํ•ด์‹œ ์ถฉ๋Œ ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ํ‚ค-๊ฐ’ ๋งคํ•‘ ํ•„์š” ์‹œ.
// JavaScript Map ์˜ˆ์ œ
const map = new Map();
map.set('apple', 3); // O(1)
console.log(map.get('apple')); // O(1)

๐Ÿ“Œ ์Šคํƒ (Stack)

  • ํŠน์ง•: LIFO ๊ตฌ์กฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ, Undo ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋“ฑ์— ํ™œ์šฉ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: DFS, ๊ด„ํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ.
stack = []
stack.append(1)  # push O(1)
stack.append(2)
print(stack.pop()) # pop O(1)

๐Ÿ“Œ ํ (Queue)

  • ํŠน์ง•: FIFO ๊ตฌ์กฐ, ์ˆœ์ฐจ ์ฒ˜๋ฆฌ ์ž‘์—…์— ํ™œ์šฉ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: BFS, ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ.
from collections import deque
queue = deque()
queue.append(1)   # enqueue O(1)
queue.append(2)
print(queue.popleft())  # dequeue O(1)

๐Ÿ“Œ ๋ฐํฌ (Deque)

  • ํŠน์ง•: ์–‘์ชฝ ๋์—์„œ ์‚ฝ์ž…/์‚ญ์ œ ๊ฐ€๋Šฅ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ, ์–‘๋ฐฉํ–ฅ ํƒ์ƒ‰.
dq = deque()
dq.appendleft(1) # O(1)
dq.append(2)     # O(1)
dq.pop()         # O(1)

๐Ÿ“Œ ํŠธ๋ฆฌ (Tree) & ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ (BST)

  • ํŠน์ง•: ๊ณ„์ธต์  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ •๋ ฌ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์œ ๋ฆฌ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: DB ์ธ๋ฑ์Šค, ๊ณ„์ธต์  ๊ตฌ์กฐ ํ‘œํ˜„.
// ๊ฐ„๋‹จํ•œ BST ์‚ฝ์ž… ์˜ˆ์ œ
class Node {
    int value;
    Node left, right;
    Node(int value) { this.value = value; }
}

Node insert(Node root, int value) {
    if (root == null) return new Node(value);
    if (value < root.value) root.left = insert(root.left, value);
    else root.right = insert(root.right, value);
    return root;
}

๐Ÿ“Œ ํž™ (Heap)

  • ํŠน์ง•: ์ตœ๋Œ€๊ฐ’ ๋˜๋Š” ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„.
import heapq
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
print(heapq.heappop(heap)) # 1

๐Ÿ“Œ ๊ทธ๋ž˜ํ”„ (Graph)

  • ํŠน์ง•: ์ •์ (Vertex)๊ณผ ๊ฐ„์„ (Edge)์œผ๋กœ ๊ตฌ์„ฑ, ๋„คํŠธ์›Œํฌ ๋ฐ ๊ฒฝ๋กœ ํƒ์ƒ‰์— ์‚ฌ์šฉ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: SNS ๊ด€๊ณ„, ๊ฒฝ๋กœ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜.
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D'],
    'C': ['A'],
    'D': ['B']
}

๊ฒฐ๋ก 

์ด ๊ธ€์—์„œ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์‹œ๊ฐ„·๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฒซ๊ฑธ์Œ์ด๋ฉฐ, ์ด๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ๋‹น์‹ ์ด ์˜ฌ๋ฐ”๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋Š” ์ˆœ๊ฐ„, ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ ˆ๋ฐ˜์€ ์ด๋ฏธ ๋๋‚œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Comments