๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ '์ž๋ฃŒ ๊ตฌ์กฐ'

by ๋ญ…์ฆค 2025. 1. 15.
๋ฐ˜์‘ํ˜•

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

 


1. ๋ฆฌ์ŠคํŠธ (List)

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

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์ธ๋ฑ์Šค ์ ‘๊ทผ O(1), ์‚ฝ์ž…/์‚ญ์ œ O(n) (์ค‘๊ฐ„์— ์‚ฝ์ž…/์‚ญ์ œ ์‹œ)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ์ˆœ์ฐจ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ, ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ, ๋ฆฌ์ŠคํŠธ์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ๋•Œ ์œ ์šฉ
# ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
arr = [1, 2, 3]

# ๋ฆฌ์ŠคํŠธ์— ์š”์†Œ ์ถ”๊ฐ€
arr.append(4)  # O(1)

# ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ์š”์†Œ ์ ‘๊ทผ
print(arr[2])  # 3

# ๋ฆฌ์ŠคํŠธ์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ œ๊ฑฐ
arr.pop()  # O(1)

# ๋ฆฌ์ŠคํŠธ์—์„œ ์ค‘๊ฐ„์— ์š”์†Œ ์‚ฝ์ž…
arr.insert(1, 5)  # O(n)

# ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ ์‚ญ์ œ
arr.remove(2)  # O(n)

print(arr)  # [1, 5, 3]

 

2. ๋”•์…”๋„ˆ๋ฆฌ (Dictionary)

๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜ ์ž๋ฃŒ ๊ตฌ์กฐ. ์ฃผ์–ด์ง„ ํ‚ค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ํ‰๊ท  O(1) (๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ๋ชจ๋‘)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ํ‚ค ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•œ ๋ฌธ์ œ, ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ๊ทธ๋ฃนํ™” ๋“ฑ
# ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ
d = {'a': 1, 'b': 2}

# ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฐ’์— ์ ‘๊ทผ
print(d['a'])  # 1

# ์ƒˆ๋กœ์šด ํ‚ค-๊ฐ’ ์Œ ์ถ”๊ฐ€
d['c'] = 3

# ํ‚ค ์‚ญ์ œ
del d['b']

print(d)  # {'a': 1, 'c': 3}

# ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
if 'a' in d:
    print("Key 'a' exists")

 

3. ํŠœํ”Œ (Tuple)

ํŠœํ”Œ์€ ๋ถˆ๋ณ€(immutable) ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ, ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ ํ›„์—๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ํ•ด์‹œ ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ์„ ๊ฐ€์ ธ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์ธ๋ฑ์Šค ์ ‘๊ทผ O(1)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ์ €์žฅ, ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ‚ค๋กœ ์‚ฌ์šฉ
# ํŠœํ”Œ ์ƒ์„ฑ
t = (1, 2, 3)

# ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ์š”์†Œ ์ ‘๊ทผ
print(t[1])  # 2

# ํŠœํ”Œ์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
# t[0] = 5  # ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

4. ์ง‘ํ•ฉ (Set)

์ง‘ํ•ฉ์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ˆœ์„œ๊ฐ€ ์—†๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ง‘ํ•ฉ ์—ฐ์‚ฐ(ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ ๋“ฑ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•˜๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์‚ฝ์ž…/์‚ญ์ œ/๊ฒ€์ƒ‰ O(1)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ์ค‘๋ณต ์ œ๊ฑฐ, ์ง‘ํ•ฉ ์—ฐ์‚ฐ, ํŠน์ • ์š”์†Œ์˜ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
# ์ง‘ํ•ฉ ์ƒ์„ฑ
s = {1, 2, 3}

# ์š”์†Œ ์ถ”๊ฐ€
s.add(4)

# ์š”์†Œ ์‚ญ์ œ
s.remove(2)

# ์ค‘๋ณต๋œ ์š”์†Œ๋Š” ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋จ
s.add(1)

# ์ง‘ํ•ฉ ๋‚ด์— ํŠน์ • ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
if 3 in s:
    print("3 is in the set")

print(s)  # {1, 3, 4}

 

5. ์Šคํƒ (Stack)

์Šคํƒ์€ ํ›„์ž…์„ ์ถœ(LIFO) ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์žฌ๊ท€์  ๋ฌธ์ œ ํ•ด๊ฒฐ์ด๋‚˜ DFS์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์‚ฝ์ž…/์‚ญ์ œ O(1)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ๊ด„ํ˜ธ ์ง ๋งž์ถ”๊ธฐ, ํ›„์œ„ ํ‘œ๊ธฐ์‹ ๊ณ„์‚ฐ, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)
# ์Šคํƒ ๊ตฌํ˜„
stack = []

# ์Šคํƒ์— ์š”์†Œ ์ถ”๊ฐ€
stack.append(1)  # O(1)
stack.append(2)

# ์Šคํƒ์—์„œ ์š”์†Œ ์ œ๊ฑฐ
print(stack.pop())  # 2
print(stack.pop())  # 1

 

6. ํ (Queue)

ํ๋Š” ์„ ์ž…์„ ์ถœ(FIFO) ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ, ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ฃผ๋กœ BFS๋‚˜ ์ž‘์—… ์Šค์ผ€์ค„๋ง์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์‚ฝ์ž…/์‚ญ์ œ O(1)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS), ์ž‘์—… ์Šค์ผ€์ค„๋ง, ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ
from collections import deque

# ํ ๊ตฌํ˜„
queue = deque()

# ํ์— ์š”์†Œ ์ถ”๊ฐ€
queue.append(1)  # O(1)
queue.append(2)

# ํ์—์„œ ์š”์†Œ ์ œ๊ฑฐ
print(queue.popleft())  # 1
print(queue.popleft())  # 2

 

7. ํž™ (Heap)

ํž™์€ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ตœ์†Œ ํž™(Min Heap) ๋˜๋Š” ์ตœ๋Œ€ ํž™(Max Heap)์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์‚ฝ์ž…/์‚ญ์ œ O(log n)
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ์šฐ์„ ์ˆœ์œ„ ์ฒ˜๋ฆฌ, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํž™ ์ •๋ ฌ
import heapq

# ์ตœ์†Œ ํž™ ๊ตฌํ˜„
heap = []

# ํž™์— ์š”์†Œ ์ถ”๊ฐ€
heapq.heappush(heap, 3)  # O(log n)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)

# ํž™์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ๊บผ๋‚ด๊ธฐ
print(heapq.heappop(heap))  # 1
print(heapq.heappop(heap))  # 2
๋ฐ˜์‘ํ˜•