νμ΄μ¬μμ μ€ν(Stack) ꡬ쑰λ λ°μ΄ν° μ μ₯ λ° μ κ·Ό λ°©μ μ€ νλλ‘, νμ μ μΆ(LIFO: Last In, First Out) μμΉμ λ°λ¦ λλ€. μ΄λ λ§μ§λ§μ μΆκ°λ νλͺ©μ΄ κ°μ₯ λ¨Όμ μ κ±°λλ ꡬ쑰λ‘, λΈλΌμ°μ μ λ€λ‘ κ°κΈ° κΈ°λ₯μ΄λ νΈμΆ μ€ν(Call Stack)μμ νν λ³Ό μ μμ΅λλ€. μ΄λ² ν¬μ€ν μμλ νμ΄μ¬μμ μ€ν ꡬ쑰μ κ°λ , ꡬν λ°©λ², κ·Έλ¦¬κ³ μ€μ νμ© μμ λ₯Ό λ€λ£° κ²μ λλ€.
β£ λͺ©μ°¨
μ€νμ λ°°μ΄ κ΅¬μ‘°λ‘ κ΅¬νλλλ°, νμ΄μ¬μμλ λ°°μ΄μ 리μ€νΈμ ννμ ν΅ν΄ ꡬνν μ μμ΅λλ€. λ°°μ΄μ μλ£ κ΅¬μ‘°λ₯Ό ꡬννλ λ° νμν μμλ€μ λ³κ²½ν μ μμ΄μΌ νλ―λ‘, νμ΄μ¬μμλ μ£Όλ‘ λ¦¬μ€νΈλ₯Ό μ¬μ©ν©λλ€. 리μ€νΈλ μμμ μΆκ°, μ κ±°, λ³κ²½ λ±μ΄ κ°λ₯νλ©°, μ΄λ¬ν μ μ°μ± λλ¬Έμ μλ£ κ΅¬μ‘°λ₯Ό ꡬνν λ λ§μ΄ νμ©λ©λλ€. ννμ λ³κ²½μ΄ λΆκ°λ₯ν μ±μ§μ κ°μ§κ³ μμ΄, λ°μ΄ν°κ° λ³κ²½λμ§ μλ μν©μμ μ¬μ©λ©λλ€.
νμ΄μ¬μ 리μ€νΈμ ννμ λν μμΈν λ΄μ©μ μλ ν¬μ€ν μ μ°Έκ³ ν΄ μ£ΌμΈμπ
01. μ€νμ΄λ?π§
μ€ν(Stack)μ νμ μ μΆ(LIFO: Last In, First Out) μμΉμ λ°λ₯΄λ μ ν μλ£κ΅¬μ‘°μ λλ€. μ΄λ λ§μ§λ§μ μΆκ°λ νλͺ©μ΄ κ°μ₯ λ¨Όμ μ κ±°λλ ꡬ쑰λ‘, μλ¨μμλ§ λ°μ΄ν°λ₯Ό μ½μ νκ³ μμ ν μ μμ΅λλ€. μ€νμ μ»΄ν¨ν° κ³Όνμμ λ§€μ° μ€μν κ°λ μΌλ‘, λ€μν μκ³ λ¦¬μ¦κ³Ό λ°μ΄ν° μ²λ¦¬ κ³Όμ μμ νμ©λ©λλ€.
μ€νμ λ°μ΄ν°μ μμ μ μ₯ λ° κ΄λ¦¬, ν¨μ νΈμΆμ μμ κ΄λ¦¬, μμμ κ΄νΈ κ²μ¬ λ± λ€μν κ³³μμ μ¬μ©λ©λλ€. μ€νμ μ΄ν΄νκ³ νμ©νλ©΄ μκ³ λ¦¬μ¦μ ν¨κ³Όμ μΌλ‘ ꡬννκ³ λ°μ΄ν° μ²λ¦¬ κ³Όμ μ κ°λ¨νκ³ μ§κ΄μ μΌλ‘ λ§λ€ μ μμ΅λλ€.
1-1. μ€νμ μ°μ°
μ€νμ λ°μ΄ν°λ₯Ό μμλλ‘ μμ μ¬λ¦¬λ ꡬ쑰μ λλ€. μΌλ°μ μΈ μ€νμ μ°μ°μ λ€μκ³Ό κ°μ΅λλ€.
- push: μ€νμ μλ¨μ νλͺ©μ μΆκ°ν©λλ€.
- pop: μ€νμ μλ¨μμ νλͺ©μ μ κ±°νκ³ λ°νν©λλ€.
μΆκ°μ μΌλ‘, μ€νμ νμ¬ μνλ₯Ό νμΈνκΈ° μν μ°μ°λ€λ μμ΅λλ€:
- peek: μ€νμ μλ¨μ μλ νλͺ©μ μ κ±°νμ§ μκ³ λ°νν©λλ€.
- is_empty: μ€νμ΄ λΉμ΄ μλμ§ νμΈν©λλ€.
- size: μ€νμ μλ νλͺ©μ κ°μλ₯Ό λ°νν©λλ€.
- μ€λ²νλ‘(Overflow): μ€νμ΄ κ½ μ°¬ μνμμ μΆκ°λ‘ νλͺ©μ μ½μ νλ €κ³ ν λ λ°μν©λλ€.
- μΈλνλ‘(Underflow): μ€νμ΄ λΉμ΄ μλ μνμμ νλͺ©μ μ κ±°νλ €κ³ ν λ λ°μν©λλ€.
1-2. μ€νμ νμ© μ : μΉ λΈλΌμ°μ μ μ΄μ νμ΄μ§λ‘ μ΄λ
μΉ λΈλΌμ°μ μ λ€λ‘ κ°κΈ° κΈ°λ₯μ μ€νμ μ΄μ©νμ¬ κ΅¬νλ©λλ€. μ¬μ©μκ° λ°©λ¬Έν νμ΄μ§λ₯Ό μ€νμ μ μ₯νκ³ , 'λ€λ‘ κ°κΈ°' λ²νΌμ ν΄λ¦ν λλ§λ€ μ€νμ μλ¨μμ νμ΄μ§λ₯Ό μ κ±°νμ¬ μ΄μ νμ΄μ§λ‘ μ΄λν©λλ€.
1-3. μΆμ μλ£ν
μ€νμ μΆμμλ£ν(Abstract Data Type, ADT)μΌλ‘ μ μλ©λλ€. μ΄λ μ€νμ λμμ μ μνλ λͺ μΈμ΄λ©°, μ΄λ₯Ό ꡬννλ λ€μν λ°©λ²μ΄ μ‘΄μ¬ν©λλ€. μΆμμλ£νμ ꡬν μΈλΆ μ¬νκ³Ό 무κ΄νκ² μ€νμ λμμ μ€λͺ νλ λ° μ€μ μ λ‘λλ€.
02. λ°°μ΄κ΅¬μ‘°λ‘ μ€ν ꡬννκΈ°
μ€νμ λ°°μ΄ κ΅¬μ‘°λ μ°κ²° 리μ€νΈ ꡬ쑰λ₯Ό ν΅ν΄ ꡬνν μ μμ΅λλ€. μ¬κΈ°μλ λ°°μ΄ κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ μ€νμ ꡬννλ λ°©λ²μ λν΄ μ€λͺ νκ² μ΅λλ€.
2-1. μλ£κ΅¬μ‘°μ ꡬν λ°©λ²λ€ (λ°°μ΄κ΅¬μ‘°, μ°κ²°λ ꡬ쑰)
- λ°°μ΄κ΅¬μ‘°: κ³ μ λ ν¬κΈ°μ λ°°μ΄μ μ¬μ©νμ¬ μ€νμ ꡬνν©λλ€. μ΄ λ°©λ²μ ꡬνμ΄ κ°λ¨νκ³ , μΈλ±μ€λ₯Ό μ΄μ©ν λΉ λ₯Έ μ κ·Όμ΄ κ°λ₯ν©λλ€. κ·Έλ¬λ λ°°μ΄μ ν¬κΈ°κ° κ³ μ λμ΄ μμ΄ ν¬κΈ°λ₯Ό μ΄κ³Όνλ©΄ μ€ν μ€λ²νλ‘κ° λ°μν©λλ€.
- μ°κ²°λ ꡬ쑰: μ°κ²° 리μ€νΈλ₯Ό μ¬μ©νμ¬ μ€νμ ꡬνν©λλ€. μ΄ λ°©λ²μ λμ μΌλ‘ ν¬κΈ°λ₯Ό μ‘°μ ν μ μμ΄ λ©λͺ¨λ¦¬ ν¨μ¨μ μ΄μ§λ§, λ Έλμ μ°κ²°κ³Ό ν΄μ μ μΆκ°μ μΈ μκ°μ΄ μμλ©λλ€.
2-2. λ°°μ΄ κ΅¬μ‘°μ μ€νμ μν λ°μ΄ν°
λ°°μ΄ κ΅¬μ‘°μ μ€νμ ꡬνν λ, κ³ μ λ ν¬κΈ°μ λ°°μ΄μ μ¬μ©νμ¬ μ€νμ μ©λ(capacity)μ μ€μ ν μ μμ΅λλ€. μ΄λ top λ³μλ μ€νμ νμ¬ μλ¨ μμΉλ₯Ό κ°λ¦¬ν΅λλ€.
2-3. μ€νμ μ°μ°
μ€νμμ μ¬μ©ν μ£Όμ μ°μ°μ λ€μκ³Ό κ°μ΅λλ€.
- push: 리μ€νΈμ λμ νλͺ©μ μΆκ°ν©λλ€.
- pop: 리μ€νΈμ λμμ νλͺ©μ μ κ±°νκ³ λ°νν©λλ€.
- peek: 리μ€νΈμ λμ μλ νλͺ©μ μ κ±°νμ§ μκ³ λ°νν©λλ€.
- is_empty: 리μ€νΈκ° λΉμ΄ μλμ§ νμΈν©λλ€.
- size: 리μ€νΈμ μλ νλͺ©μ κ°μλ₯Ό λ°νν©λλ€.
λ€μμ κ³ μ λ ν¬κΈ°μ λ°°μ΄μ μ¬μ©νμ¬ μ€νμ ꡬνν μμ μ λ°μ΄ν°λ₯Ό μΆκ°νκ³ μ κ±°νλ μμ μ λλ€.
class ArrayStack:
def __init__(self, capacity=10):
# μ€νμ μ©λμ μ€μ νκ³ λ°°μ΄μ μ΄κΈ°νν©λλ€.
self.capacity = capacity
self.array = [None] * capacity
self.top = -1 # μ€νμ μλ¨μ κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό μ΄κΈ°νν©λλ€.
def is_empty(self):
# μ€νμ΄ λΉμ΄ μλμ§ νμΈν©λλ€.
return self.top == -1
def is_full(self):
# μ€νμ΄ κ°λ μ°Όλμ§ νμΈν©λλ€.
return self.top == self.capacity - 1
def push(self, item):
# μ€νμ μλ¨μ νλͺ©μ μΆκ°ν©λλ€.
if self.is_full():
# μ€νμ΄ κ°λ μ°ΌμΌλ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
raise OverflowError("push to full stack")
self.top += 1 # μλ¨ ν¬μΈν°λ₯Ό μ¦κ°μν΅λλ€.
self.array[self.top] = item # μλ‘μ΄ νλͺ©μ μλ¨μ μΆκ°ν©λλ€.
def pop(self):
# μ€νμ μλ¨μμ νλͺ©μ μ κ±°νκ³ λ°νν©λλ€.
if self.is_empty():
# μ€νμ΄ λΉμ΄ μμΌλ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
raise IndexError("pop from empty stack")
item = self.array[self.top] # μλ¨μ νλͺ©μ κ°μ Έμ΅λλ€.
self.array[self.top] = None # μλ¨μ νλͺ©μ NoneμΌλ‘ μ€μ νμ¬ μ¬λ‘―μ λΉμλλ€.
self.top -= 1 # μλ¨ ν¬μΈν°λ₯Ό κ°μμν΅λλ€.
return item # μλ¨μ νλͺ©μ λ°νν©λλ€.
def peek(self):
# μ€νμ μλ¨μ μλ νλͺ©μ μ κ±°νμ§ μκ³ λ°νν©λλ€.
if self.is_empty():
# μ€νμ΄ λΉμ΄ μμΌλ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
raise IndexError("peek from empty stack")
return self.array[self.top] # μλ¨μ νλͺ©μ λ°νν©λλ€.
def size(self):
# μ€νμ μλ νλͺ©μ κ°μλ₯Ό λ°νν©λλ€.
return self.top + 1
# μ€ν μ¬μ© μμ
stack = ArrayStack(10)
stack.push(1) # μ€νμ 1μ μΆκ°ν©λλ€.
stack.push(2) # μ€νμ 2λ₯Ό μΆκ°ν©λλ€.
stack.push(3) # μ€νμ 3μ μΆκ°ν©λλ€.
print(stack.pop()) # μΆλ ₯: 3 (μ€νμ μλ¨μμ 3μ μ κ±°νκ³ λ°νν©λλ€.)
print(stack.peek()) # μΆλ ₯: 2 (μ€νμ μλ¨μ μλ 2λ₯Ό μ κ±°νμ§ μκ³ λ°νν©λλ€.)
print(stack.size()) # μΆλ ₯: 2 (μ€νμ μλ νλͺ©μ κ°μλ₯Ό λ°νν©λλ€.)
2-4. μ€νμ ν΄λμ€λ‘ ꡬν
μλ£κ΅¬μ‘°λ ν¨μλ₯Ό κΈ°λ°μΌλ‘ νλ μ μ°¨μ νλ‘κ·Έλλ°λ³΄λ€ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ νλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° κΈ°λ²μ μ΄μ©ν΄ ꡬννλ κ²μ΄ ν¨μ¬ μ’μ΅λλ€. μ΄λ μλ£κ΅¬μ‘°μ μΆμμλ£νμ΄ ν΄λμ€μ κ°λ κ³Ό μ νν μΌμΉνκΈ° λλ¬Έμ λλ€. λ€μμ νμ΄μ¬μμ λ°°μ΄ κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ μ€νμ ꡬνν μμ μ λλ€.
class Stack:
def __init__(self):
self.items = []
def is_empty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("pop from empty stack")
def peek(self):
if not self.is_empty():
return self.items[-1]
else:
raise IndexError("peek from empty stack")
def size(self):
return len(self.items)
ꡬνν μ€ν ν΄λμ€λ₯Ό μ΄μ©νμ¬ λ°μ΄ν°λ₯Ό μ€νμ μΆκ°νκ³ μ κ±°νλ μμ λ λ€μκ³Ό κ°μ΅λλ€.
# μ€ν μ¬μ© μμ
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop()) # μΆλ ₯: 3
print(stack.peek()) # μΆλ ₯: 2
print(stack.size()) # μΆλ ₯: 2
μ΄μ²λΌ λ°°μ΄ κ΅¬μ‘°λ₯Ό μ¬μ©ν μ€ν ꡬνμ κ°λ¨νκ³ ν¨μ¨μ μ λλ€. 리μ€νΈμ λλΆλΆμ μ€νμ μλ¨μΌλ‘ κ°μ£Όνμ¬ λ°μ΄ν°λ₯Ό μΆκ°νκ³ μ κ±°ν μ μμ΅λλ€.
03. μ€νμ νμ© μμ : κ΄νΈ κ²μ¬ νλ‘κ·Έλ¨
μ€νμ κ΄νΈμ μ§μ΄ λ§λμ§ νμΈνλ λ¬Έμ μ μ μ©νκ² νμ©λ μ μμ΅λλ€. μ΄ μΉμ μμλ μ€νμ μ¬μ©νμ¬ κ΄νΈμ μ§μ κ²μ¬νλ μκ³ λ¦¬μ¦κ³Ό μ΄λ₯Ό ꡬνν νλ‘κ·Έλ¨μ μ΄ν΄λ³΄κ² μ΅λλ€.
3-1. κ΄νΈ κ²μ¬ μκ³ λ¦¬μ¦
κ΄νΈ κ²μ¬ μκ³ λ¦¬μ¦μ λ¬Έμμ΄μ μλ κ΄νΈλ€μ΄ μ¬λ°λ₯΄κ² μ§μ§μ΄μ Έ μλμ§ νμΈν©λλ€. μ΄ μκ³ λ¦¬μ¦μ λ€μκ³Ό κ°μ΄ λμν©λλ€:
- λ¬Έμμ΄μ μ²μλΆν° λκΉμ§ μνν©λλ€.
- μ¬λ κ΄νΈκ° λμ€λ©΄ μ€νμ push ν©λλ€.
- λ«λ κ΄νΈκ° λμ€λ©΄ μ€νμμ pop νμ¬ μ§μ΄ λ§λ μ¬λ κ΄νΈμΈμ§ νμΈν©λλ€.
- λ¬Έμμ΄μ λκΉμ§ κ²μ¬νμ λ μ€νμ΄ λΉμ΄ μμΌλ©΄ λͺ¨λ κ΄νΈκ° μ¬λ°λ₯΄κ² μ§μ§μ΄μ Έ μλ κ²μ λλ€.
- μ€νμ΄ λΉμ΄ μμ§ μκ±°λ μ§μ΄ λ§μ§ μλ κ²½μ°, κ΄νΈκ° μ¬λ°λ₯΄κ² μ§μ§μ΄μ Έ μμ§ μμ κ²μ λλ€.
3-1. κ΄νΈ κ²μ¬ νλ‘κ·Έλ¨
λ€μμ νμ΄μ¬μμ μ€νμ μ¬μ©νμ¬ κ΄νΈμ μ§μ κ²μ¬νλ νλ‘κ·Έλ¨μ λλ€.
class Stack:
def __init__(self):
self.items = []
def is_empty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
else:
raise IndexError("pop from empty stack")
def peek(self):
if not self.is_empty():
return self.items[-1]
else:
raise IndexError("peek from empty stack")
def size(self):
return len(self.items)
def is_balanced(expression):
stack = Stack()
# κ΄νΈμ μ§μ λ§μΆκΈ° μν λμ
λ리
pairs = {')': '(', '}': '{', ']': '['}
for char in expression:
if char in pairs.values():
# μ¬λ κ΄νΈλ₯Ό μ€νμ μΆκ°
stack.push(char)
elif char in pairs.keys():
# λ«λ κ΄νΈκ° λμ€λ©΄ μ€νμμ μ¬λ κ΄νΈλ₯Ό μ κ±°νκ³ μ§μ΄ λ§λμ§ νμΈ
if stack.is_empty() or stack.pop() != pairs[char]:
return False
# λͺ¨λ κ΄νΈκ° μ§μ΄ λ§λ€λ©΄ μ€νμ΄ λΉμ΄ μμ΄μΌ ν¨
return stack.is_empty()
# κ΄νΈ κ²μ¬ νλ‘κ·Έλ¨ μ¬μ© μμ
print(is_balanced("(a + b) * (c + d)")) # μΆλ ₯: True
print(is_balanced("{[a + b] * (c + d)}")) # μΆλ ₯: True
print(is_balanced("{[a + b] * (c + d)")) # μΆλ ₯: False
μ£Όμ ν¨μ μ€λͺ
- is_balanced: μ£Όμ΄μ§ ννμμ κ΄νΈκ° μ¬λ°λ₯΄κ² μ§μ§μ΄μ Έ μλμ§ νμΈν©λλ€.
- expression: κ΄νΈμ μ§μ κ²μ¬ν λ¬Έμμ΄μ λλ€.
- stack: μ€ν μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ κ΄νΈλ₯Ό μ μ₯ν©λλ€.
- pairs: λ«λ κ΄νΈμ μ¬λ κ΄νΈμ μ§μ λ§μΆκΈ° μν λμ λ리μ λλ€.
- λ¬Έμμ΄μ μννλ©΄μ μ¬λ κ΄νΈλ μ€νμ push νκ³ , λ«λ κ΄νΈλ μ€νμμ pop νμ¬ μ§μ΄ λ§λμ§ νμΈν©λλ€.
- λͺ¨λ κ΄νΈλ₯Ό κ²μ¬ν ν μ€νμ΄ λΉμ΄ μμΌλ©΄ Trueλ₯Ό λ°ννκ³ , κ·Έλ μ§ μμΌλ©΄ Falseλ₯Ό λ°νν©λλ€.
μ΄ νλ‘κ·Έλ¨μ ν΅ν΄ λ¬Έμμ΄μ κ΄νΈκ° μ¬λ°λ₯΄κ² μ§μ§μ΄μ Έ μλμ§ μ½κ² νμΈν μ μμ΅λλ€. κ΄νΈ κ²μ¬ μκ³ λ¦¬μ¦μ μ»΄νμΌλ¬μμ μ½λμ ꡬ문 μ€λ₯λ₯Ό κ²μ¬νκ±°λ ν μ€νΈ μλν°μμ κ΄νΈ μ§μ λ§μΆλ κΈ°λ₯ λ±μ νμ©λ μ μμ΅λλ€.
04. νμ΄μ¬μμ μ€ν μ¬μ©νκΈ°
νμ΄μ¬μμ μ€νμ μ¬μ©νλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ΅λλ€. μ΄ μΉμ μμλ νμ΄μ¬ 리μ€νΈλ₯Ό μ€νμΌλ‘ μ¬μ©νλ λ°©λ²κ³Ό queue λͺ¨λμ LifoQueueλ₯Ό μ¬μ©νλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. μ΄ λ κ°μ§ λ°©λ²μ ν΅ν΄ νμ΄μ¬μμ μ€νμ μ½κ² ꡬννκ³ μ¬μ©ν μ μμ΅λλ€. 리μ€νΈλ₯Ό μ¬μ©νλ λ°©λ²μ κ°λ¨νκ³ μ§κ΄μ μ΄λ©°, LifoQueueλ₯Ό μ¬μ©νλ λ°©λ²μ μ€λ λ μμ μ±μ μ 곡νλ―λ‘ λ©ν°μ€λ λ© νκ²½μμ μ μ©ν©λλ€.
4-1. νμ΄μ¬ 리μ€νΈλ₯Ό μ€νμΌλ‘ μ¬μ©νκΈ°
νμ΄μ¬μ 리μ€νΈ μλ£νμ μ€νμ μ°μ°μ μ½κ² μ§μν©λλ€. 리μ€νΈμ append() λ©μλλ‘ push μ°μ°μ, pop() λ©μλλ‘ pop μ°μ°μ μνν μ μμ΅λλ€.
λ€μμ νμ΄μ¬ 리μ€νΈλ₯Ό μ¬μ©νμ¬ μ€νμ ꡬνν μμ μ λλ€.
class ListStack:
def __init__(self):
# μ€νμ ꡬννκΈ° μν΄ λΉ λ¦¬μ€νΈλ₯Ό μ΄κΈ°νν©λλ€.
self.items = []
def is_empty(self):
# μ€νμ΄ λΉμ΄ μλμ§ νμΈν©λλ€.
return len(self.items) == 0
def push(self, item):
# μ€νμ μλ¨μ νλͺ©μ μΆκ°ν©λλ€.
self.items.append(item)
def pop(self):
# μ€νμ μλ¨μμ νλͺ©μ μ κ±°νκ³ λ°νν©λλ€.
if not self.is_empty():
return self.items.pop()
else:
# μ€νμ΄ λΉμ΄ μμΌλ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
raise IndexError("pop from empty stack")
def peek(self):
# μ€νμ μλ¨μ μλ νλͺ©μ μ κ±°νμ§ μκ³ λ°νν©λλ€.
if not self.is_empty():
return self.items[-1]
else:
# μ€νμ΄ λΉμ΄ μμΌλ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
raise IndexError("peek from empty stack")
def size(self):
# μ€νμ μλ νλͺ©μ κ°μλ₯Ό λ°νν©λλ€.
return len(self.items)
# 리μ€νΈλ₯Ό μ¬μ©ν μ€ν μ¬μ© μμ
stack = ListStack()
stack.push(1) # μ€νμ 1μ μΆκ°ν©λλ€.
stack.push(2) # μ€νμ 2λ₯Ό μΆκ°ν©λλ€.
stack.push(3) # μ€νμ 3μ μΆκ°ν©λλ€.
print(stack.pop()) # μΆλ ₯: 3 (μ€νμ μλ¨μμ 3μ μ κ±°νκ³ λ°νν©λλ€.)
print(stack.peek()) # μΆλ ₯: 2 (μ€νμ μλ¨μ μλ 2λ₯Ό μ κ±°νμ§ μκ³ λ°νν©λλ€.)
print(stack.size()) # μΆλ ₯: 2 (μ€νμ μλ νλͺ©μ κ°μλ₯Ό λ°νν©λλ€.)
μ£Όμ λ©μλ μ€λͺ
μ΄ μ½λμμλ Stack ν΄λμ€λ₯Ό μ μνκ³ , νμ΄μ¬μ 리μ€νΈλ₯Ό λ΄λΆμ μΌλ‘ μ¬μ©νμ¬ μ€νμ ꡬννμμ΅λλ€. κ° λ©μλμ μν μ λ€μκ³Ό κ°μ΅λλ€.
- __init__() λ©μλ: μ€νμ μ΄κΈ°νν©λλ€. μ¬κΈ°μλ λΉμ΄ μλ 리μ€νΈλ₯Ό self.itemsμ μ μ₯ν©λλ€.
- is_empty() λ©μλ: μ€νμ΄ λΉμ΄ μλμ§ μ¬λΆλ₯Ό λ°νν©λλ€. 리μ€νΈμ κΈΈμ΄κ° 0μ΄λ©΄ λΉμ΄ μλ κ²μΌλ‘ νλ¨ν©λλ€.
- isFull(): νμ΄μ¬ 리μ€νΈλ μ©λμ΄ λ¬΄νλμ΄λ―λ‘ μ€νμ ν¬νμνλ μλ―Έκ° μμΌλ©° νμ falseμ λλ€.
- push(item) λ©μλ: μ€νμ 맨 μμ λ°μ΄ν°λ₯Ό μΆκ°ν©λλ€. 리μ€νΈμ append() λ©μλλ₯Ό μ¬μ©νμ¬ κ΅¬νν©λλ€.
- pop() λ©μλ: μ€νμ 맨 μμμ λ°μ΄ν°λ₯Ό μ κ±°νκ³ λ°νν©λλ€. 리μ€νΈμ pop() λ©μλλ₯Ό μ¬μ©νλ©°, μ€νμ΄ λΉμ΄ μλ κ²½μ° IndexErrorλ₯Ό λ°μμν΅λλ€.
- peek() λ©μλ: μ€νμ 맨 μμ μλ λ°μ΄ν°λ₯Ό λ°ννμ§λ§ μ κ±°νμ§λ μμ΅λλ€. 리μ€νΈμ μΈλ±μ€ -1(리μ€νΈμ λ§μ§λ§ μμλ₯Ό μμλ‘ νν)μ μ¬μ©νμ¬ κ΅¬ννλ©°, μ€νμ΄ λΉμ΄ μλ κ²½μ° IndexErrorλ₯Ό λ°μμν΅λλ€.
- size() λ©μλ: μ€νμ μ μ₯λ λ°μ΄ν°μ κ°μλ₯Ό λ°νν©λλ€. 리μ€νΈμ κΈΈμ΄λ₯Ό λ°νν©λλ€.
4-2. queue λͺ¨λμ LifoQueue μ¬μ©νκΈ°
νμ΄μ¬μ queue λͺ¨λμμλ LifoQueue ν΄λμ€λ₯Ό μ 곡νμ¬ μ€νμ κ°νΈνκ² κ΅¬νν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μΆκ°μ μΈ μ€ν ꡬν μμ΄λ λ€μν λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
λ€μμ queue λͺ¨λμ LifoQueueλ₯Ό μ¬μ©ν μμ μ λλ€.
from queue import LifoQueue
# LifoQueue κ°μ²΄ μμ±
stack = LifoQueue()
# λ°μ΄ν° μΆκ° (push)
stack.put(1)
stack.put(2)
stack.put(3)
# μ€νμ ν¬κΈ° νμΈ
print("μ€νμ ν¬κΈ°:", stack.qsize())
# λ°μ΄ν° μ κ±° λ° λ°ν (pop)
print("pop:", stack.get())
# μ€νμ ν¬κΈ° λ€μ νμΈ
print("μ€νμ ν¬κΈ°:", stack.qsize())
# peek κΈ°λ₯ ꡬν (맨 μ λ°μ΄ν° νμΈ)
def peek(stack):
if not stack.empty():
top_element = stack.get()
stack.put(top_element)
return top_element
else:
raise IndexError("peek from empty stack")
# peek ν¨μ μ¬μ© μμ
print("peek:", peek(stack))
# μ€νμ ν¬κΈ° νμΈ (peek ν¨μλ λ°μ΄ν°λ₯Ό μ κ±°νμ§ μμ)
print("μ€νμ ν¬κΈ°:", stack.qsize())
μ£Όμ λ©μλ μ€λͺ
λν, peek() λ©μλλ LifoQueue ν΄λμ€μ μ§μ μ μΌλ‘ ν¬ν¨λμ΄ μμ§ μκΈ° λλ¬Έμ, λ³λλ‘ ν¨μλ₯Ό μ μνμ¬ μ€νμ 맨 μ λ°μ΄ν°λ₯Ό νμΈνλ κΈ°λ₯μ ꡬννμ΅λλ€. μ΄ ν¨μλ μ€νμμ λ°μ΄ν°λ₯Ό μ κ±°νμ§ μκ³ μ‘°ννλ λ°©μμΌλ‘ λμν©λλ€.
05. μμ€ν μ€νκ³Ό μννΈμΆ
μμ€ν μ€ν(System Stack)κ³Ό μννΈμΆ(Recursion)μ νλ‘κ·Έλλ°μμ μ€μν κ°λ μ λλ€. κ°κ°μ κ°λ μ κ°λ¨ν μ€λͺ νκ³ , μ΄λ»κ² μνΈμμ©νλμ§μ λν΄ μμλ³΄κ² μ΅λλ€.
5-1. μμ€ν μ€ν(System Stack)
μμ€ν μ€νμ ν¨μ νΈμΆμ κ΄λ¦¬νκΈ° μν΄ μ¬μ©λλ λ©λͺ¨λ¦¬ μμμ λλ€. μΌλ°μ μΌλ‘ κ° ν¨μ νΈμΆμ μ€ν λ©λͺ¨λ¦¬μ νλ μ(Frame)μ΄λΌκ³ λΆλ¦¬λ λ°μ΄ν° κ΅¬μ‘°λ‘ μ μ₯λ©λλ€. κ° νλ μμ ν¨μμ μΈμ, λ‘컬 λ³μ λ° ν¨μκ° λ°νλ μμΉ λ±μ μ 보λ₯Ό ν¬ν¨ν©λλ€.
μμ€ν μ€νμ μ£Όμ νΉμ±μ λ€μκ³Ό κ°μ΅λλ€:
- LIFO (Last In, First Out): ν¨μ νΈμΆμ΄ μ€νμ μμ΄κ³ , κ°μ₯ μ΅κ·Όμ νΈμΆλ ν¨μκ° κ°μ₯ λ¨Όμ λ°νλ©λλ€.
- μ¬κ· νΈμΆ κ΄λ¦¬: μ¬κ· ν¨μ νΈμΆ μ κ° μ¬κ· νΈμΆμ μλ‘μ΄ νλ μμ μμ€ν μ€νμ μΆκ°ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬κ· νΈμΆμ΄ κΉμ΄μ§ λλ§λ€ μμ€ν μ€νλ κ·Έμ λ§κ² μ¦κ°ν©λλ€.
μμ€ν μ€νμ ν¬κΈ°λ μ νλμ΄ μκΈ° λλ¬Έμ, λ무 λ§μ μ¬κ· νΈμΆμ΄λ λ무 κΉμ μ¬κ· νΈμΆμ μ€ν μ€λ²νλ‘μ°(Stack Overflow)λ₯Ό μΌμΌν¬ μ μμ΅λλ€. μ΄λ μ€νμ΄ μ΅λ μ©λμ μ΄κ³Όνμ¬ μμ€ν μ΄ λ μ΄μ ν¨μ νΈμΆμ μ²λ¦¬ν μ μκ² λλ μν©μ λ§ν©λλ€.
5-2. μννΈμΆ(Recursion)
μννΈμΆμ ν¨μκ° μκΈ° μμ μ μ§μ λλ κ°μ μ μΌλ‘ νΈμΆνλ κ²μ λ§ν©λλ€. μ΄λ λ€μν μκ³ λ¦¬μ¦κ³Ό λ¬Έμ ν΄κ²° λ°©λ²μμ μ μ©νκ² μ¬μ©λ©λλ€. μ£Όμ νΉμ±μ λ€μκ³Ό κ°μ΅λλ€:
- κΈ°λ³Έ μ¬λ‘(Base case): μ¬κ· ν¨μλ μμ μ κ³μ νΈμΆνλλ°, μ΄λ₯Ό λ©μΆκΈ° μν μ’ λ£ μ‘°κ±΄μ΄ νμν©λλ€. μ΄ μ’ λ£ μ‘°κ±΄μ κΈ°λ³Έ μ¬λ‘λΌκ³ ν©λλ€.
- μ¬κ· μ¬λ‘(Recursive case): κΈ°λ³Έ μ¬λ‘λ₯Ό λ§μ‘±νμ§ μμ λ μμ μ νΈμΆνμ¬ μμ λ¬Έμ λ‘ λΆν΄νκ³ ν΄κ²°ν©λλ€.
- μ€νμ μ¬μ©ν ꡬν: λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μμ μ¬κ· νΈμΆμ λ΄λΆμ μΌλ‘ μμ€ν μ€νμ μ¬μ©νμ¬ κ΅¬νλ©λλ€. κ° μ¬κ· νΈμΆμ μλ‘μ΄ νλ μμ μμ€ν μ€νμ μΆκ°νκ² λ©λλ€.
5-3. μμ€ν μ€νκ³Ό μννΈμΆμ μνΈμμ©
μ¬κ· νΈμΆμ μ¬μ©νλ©΄, μμ€ν μ€νμ μ¬λ¬ κ°μ μ¬κ· νΈμΆ νλ μμ΄ μ°¨λ‘λ‘ μμ΄κ² λ©λλ€. κ° μ¬κ· νΈμΆμ μμ μ νλ μμ μ€νμ μΆκ°νκ³ , κΈ°λ³Έ μ¬λ‘κ° λνλ λκΉμ§ κ³μν΄μ μλ‘μ΄ νλ μμ μΆκ°νκ² λ©λλ€. μ¬κ· νΈμΆμ΄ κΉμ΄μ§λ©΄ μμ€ν μ€νλ κ·Έμ λ§κ² κΉμ΄μ§κ² λ©λλ€.
μλ₯Ό λ€μ΄, ν©ν 리μΌμ ꡬνλ μ¬κ· ν¨μλ₯Ό μ΄ν΄λ³΄λ©΄
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
μ΄ ν¨μλ μμ μ κ³μ νΈμΆνμ¬ ν©ν λ¦¬μΌ κ°μ κ³μ°ν©λλ€. νΈμΆμ΄ κΉμ΄μ§μλ‘ μμ€ν μ€νλ κ·Έμ λ§κ² κΉμ΄μ§κ² λ©λλ€. λ°λΌμ μ¬κ· νΈμΆμ μ¬μ©ν λλ μμ€ν μ€νμ ν¬κΈ° μ νμ κ³ λ €νμ¬ μ€ν μ€λ²νλ‘μ°λ₯Ό λ°©μ§ν νμκ° μμ΅λλ€.
κ²°λ‘ μ μΌλ‘, μμ€ν μ€νκ³Ό μννΈμΆμ νλ‘κ·Έλλ°μμ μ€μν κ°λ μ΄λ©°, μ¬κ· νΈμΆμ ν΅ν΄ μ€νμ νμ©νλ κ²μ λ€μν μκ³ λ¦¬μ¦ λ° λ¬Έμ ν΄κ²°μ μ μ©νκ² μ¬μ©λ©λλ€.
06. ν΅μ¬ λ΄μ©π