π― 1. μ€νκ³Ό ν κΈ°λ³Έ κ°λ
βββ
μ€ν (Stack) - LIFO (Last In First Out)
# μ€ν: λμ€μ λ€μ΄κ° κ²μ΄ λ¨Όμ λμ΄ (μ μ μκΈ°)
#
# βββββ
# β 3 β β top (κ°μ₯ λμ€μ λ€μ΄μ΄)
# βββββ€
# β 2 β
# βββββ€
# β 1 β β bottom (κ°μ₯ λ¨Όμ λ€μ΄μ΄)
# βββββ
#
# push(3) β pop() β 3μ΄ λμ΄
# μ€ν μ°μ°
# - push: 맨 μμ μΆκ°
# - pop: 맨 μμμ μ κ±°
# - peek/top: 맨 μ μμ νμΈ (μ κ±° μ ν¨)
ν (Queue) - FIFO (First In First Out)
# ν: λ¨Όμ λ€μ΄κ° κ²μ΄ λ¨Όμ λμ΄ (μ€μκΈ°)
#
# front rear
# β β
# βββββ¬ββββ¬ββββ¬ββββ
# β 1 β 2 β 3 β 4 β
# βββββ΄ββββ΄ββββ΄ββββ
#
# enqueue(4) β dequeue() β 1μ΄ λμ΄
# ν μ°μ°
# - enqueue: λ€μ μΆκ°
# - dequeue: μμμ μ κ±°
# - front: 맨 μ μμ νμΈ (μ κ±° μ ν¨)
리μ€νΈλ‘ μ€ν/ν ꡬνμ λ¬Έμ
# μ€ν: 리μ€νΈλ‘ ꡬν κ°λ₯ (O(1))
stack = []
stack.append(1) # push - O(1) β
stack.append(2)
stack.pop() # pop - O(1) β
# ν: 리μ€νΈλ‘ ꡬννλ©΄ λλ¦Ό!
queue = []
queue.append(1) # enqueue - O(1) β
queue.append(2)
queue.pop(0) # dequeue - O(n) β λλ¦Ό!
# μ? pop(0)μ μ μμ μ κ±° ν λͺ¨λ μμλ₯Ό ν μΉΈμ© μμΌλ‘ μ΄λ!
# [1, 2, 3, 4, 5]
# pop(0) β [2, 3, 4, 5] # λͺ¨λ μμ μ΄λ O(n)
π― 2. deque κΈ°λ³Έ μ¬μ©λ² βββ
dequeλ?
from collections import deque
# deque (Double-Ended Queue)
# - μμͺ½ λμμ O(1)λ‘ μΆκ°/μμ κ°λ₯
# - μ€νκ³Ό νλ₯Ό λͺ¨λ ν¨μ¨μ μΌλ‘ ꡬν κ°λ₯
dq = deque([1, 2, 3, 4, 5])
μμͺ½ λ μΆκ°/μ κ±° (ν΅μ¬!) βββ
from collections import deque
dq = deque([1, 2, 3])
# μ€λ₯Έμͺ½ λ μΆκ°/μ κ±°
dq.append(4) # deque([1, 2, 3, 4]) - O(1)
dq.pop() # 4 λ°ν - O(1)
# μΌμͺ½ λ μΆκ°/μ κ±°
dq.appendleft(0) # deque([0, 1, 2, 3]) - O(1) β
dq.popleft() # 0 λ°ν - O(1) β
# μ΄κ² 리μ€νΈμμ ν΅μ¬ μ°¨μ΄!
# 리μ€νΈμ pop(0)μ O(n)μ΄μ§λ§
# dequeμ popleft()λ O(1)!
μκ°λ³΅μ‘λ λΉκ΅
| μ°μ° |
리μ€νΈ |
deque |
| append (λ) |
O(1) |
O(1) |
| appendleft (μ) |
O(n) β |
O(1) β
|
| pop (λ) |
O(1) |
O(1) |
| popleft (μ) |
O(n) β |
O(1) β
|
| μΈλ±μ€ μ κ·Ό |
O(1) β
|
O(n) β |
κΈ°λ³Έ λ©μλ
from collections import deque
dq = deque([1, 2, 3, 4, 5])
# μΆκ°
dq.append(6) # μ€λ₯Έμͺ½ λ: deque([1, 2, 3, 4, 5, 6])
dq.appendleft(0) # μΌμͺ½ λ: deque([0, 1, 2, 3, 4, 5, 6])
# μ¬λ¬ κ° μΆκ°
dq.extend([7, 8]) # deque([0, 1, 2, 3, 4, 5, 6, 7, 8])
dq.extendleft([-2, -1]) # deque([-1, -2, 0, 1, ...]) (μμ μ£Όμ!)
# μ κ±°
dq.pop() # 8 λ°ν
dq.popleft() # -1 λ°ν
# νμ
dq = deque([1, 2, 3, 4, 5])
dq.rotate(1) # deque([5, 1, 2, 3, 4]) (μ€λ₯Έμͺ½μΌλ‘)
dq.rotate(-1) # deque([1, 2, 3, 4, 5]) (μΌμͺ½μΌλ‘)
# κΈ°ν
len(dq) # κΈΈμ΄
dq[0] # 첫 λ²μ§Έ μμ (O(1))
dq[-1] # λ§μ§λ§ μμ (O(1))
# dq[2] # μ€κ° μμ (O(n) - λλ¦Ό!)
dq.clear() # μ 체 μμ
π― 3. μ€ν ꡬν λ° νμ© βββ
dequeλ‘ μ€ν ꡬν