+) 22. 08. 30. μ 리ν κ±° μΆκ°!
Dynamic Programmingμ Optimization Problemμ ν΄κ²°νλ μ λ΅ μ€ νλμ΄λ€.
μ¬κΈ°μ Optimization Problemμ΄λ, λ¬Έμ λ₯Ό ν΄κ²°νλ μ΅μ μ λ΅(Optimal Solution)μ μ°ΎμμΌ νλ λ¬Έμ λ₯Ό λ»νλ€.
Optimal Solutionμ νλ μ΄μμΌ μ μμΌλ©°, μ΅λ νΉμ μ΅μκ°μ κ°μ§λ Solutionμ μ°Ύλ λ¬Έμ λ€μ΄ μ£Όλ₯Ό μ΄λ£¬λ€. (μ: κ°μ₯ 빨리 λμ°©νλ κ²½λ‘(Solution)μ μμ μκ°(Value)μ? λ±β¦)
DPλ ν΄κ²°νλ €λ λ¬Έμ λ₯Ό μ’ λ μμ ν¬κΈ°μ SubProblemμΌλ‘ λλκ³ , κ·Έ SubProblemμ Optimal Solutionμ νμ©νμ¬ μλ Problemμ Optimal Solutionμ μ°Ύλ λ°©μμ΄λ€.
μ¬κΈ°μ λ¬Έμ λ₯Ό κ³μ μκ² μͺΌκ°λ€ 보면, μ΄λ μκ° κ²ΉμΉλ(Overlapping) SubProblemμ΄ μκΈ΄λ€. κ·Έλ΄ λ μ΄ μλΈ λ¬Έμ λ€μ κ³μ κ³μ°νλ κ²μ΄ μλλΌ λ§¨ μ²μ ν λ²λ§ κ³μ°μ νκ³ , κ·Έ κ²°κ³Όλ₯Ό μ μ₯ν λ€μ νμνλ€λ©΄ λ μ¬μ¬μ©νλ€.
Top-Down Approach | Bottom-Up Approach | |
---|---|---|
ꡬ쑰 | Recursive(μ¬κ·) | Iterative(for-loop) |
SubProblem κ²°κ³Ό μ μ₯ | Memoization | Tabulation |
μ νΈλλ μν© | SubProblemsμ μΌλΆλ§ κ³μ°ν΄λ μ΅μ’ Optimal Solutionμ ꡬν μ μμ λ | λͺ¨λ SubProblemsλ₯Ό κ³μ°ν΄μΌ μ΅μ’ Optimal Solutionμ ꡬν μ μμ λ |
Top-Down Approachλ λ¬Έμ λ€μ μμ ν¬κΈ°μ λ¬Έμ λ‘ λλμ΄μ ν΄κ²°νλ κ²μ΄κ³ , Bottom-Up Approachλ μΌλ¨ μμ ν¬κΈ°μ λ¬Έμ λΆν° μ°¨κ·Όμ°¨κ·Ό ν΄κ²°ν΄ λκ°λ κ²μ΄λ€.
Climbing Stairs
μ μκΉμ§ μ€λ₯΄λ λ° nλ²μ μ€ν
μ΄ νμν κ³λ¨μ΄ μλ€. ν λ²μ ν μ€ν
, νΉμ λ μ€ν
μ μ€λ₯Ό μ μμ λ, κ³λ¨μ μ μκΉμ§ μ€λ₯΄κΈ° μν΄μλ λͺ κ°μ μ λν¬ν λ°©λ²μ΄ μλμ§ κ΅¬νμμ€.
μ1: n = 2 β λ΅ = 2 (1step + 1step, 2steps)
μ2: n = 3 β λ΅ = 3 (1step + 1step + 1step, 1step + 2steps, 2steps + 1step)
μ λ¬Έμ λ Optimization Problemμ΄λ€.
μ΄ λͺ κ°μ μ λν¬ν λ°©λ²μ΄ μλμ§ κ΅¬νλ€λ κ²μ μ΅λ λͺ κ°μ μ λν¬ν λ°©λ²μ΄ μλμ§λ₯Ό λ¬Όμ΄λ³΄λ κ²κ³Ό λμΌνκΈ° λλ¬Έμ΄λ€.
f(n) = nμ€ν
μ κ³λ¨μ μ€λ₯΄λ μ λν¬ν λ°©λ² μμΌ λ,
β‘οΈΒ f(n) = f(n-1) + f(n-2)
def climb(n:int) -> int:
if n <= 2: #μ¬κ· ν¨μμμμ νμΆ μ‘°κ±΄
return n
return climb(n-1) + climb(n-2)
μ μ½λλ DPλ₯Ό μ μ©ν κ²μ΄ μλλΌ Recursion λ°©μμ μ μ©ν μ½λλ€. Recursion λ°©μμ μ μ©νλ©΄ μλ μ΄λ―Έμ§μ κ°μ΄ μ€λ³΅ νΈμΆμ΄ λ°μνλ€.
μ΄λ κ² κ²ΉμΉλ SubProblemλ€μ΄ λ§μ λ, λμΌν Inputμ λν Function Callμ μ²μ ν λ²λ§ κ³μ°νκ³ κ·Έ κ²°κ³Όλ₯Ό λ©λͺ¨ν΄ λλ€κ°, μ΄νμ μ¬μ¬μ©νλ λ°©μμΌλ‘ ν΄κ²°νλ©΄ λλ€.
memo = {} #Function Callμ λν κ²°κ³Όλ₯Ό μ μ₯ν 곡κ°
def climb(n:int) -> int:
if n in memo:
return memo[n]
if n <= 2: #μ¬κ· ν¨μμμμ νμΆ μ‘°κ±΄
return n
memo[n] = climb(n-1) + climb(n-2)
return climb(n-1) + climb(n-2)
Bottom-Up λ°©μ μ¬μ©
def climb(n:int) -> int:
tabular = {1:1, 2:2}
for i in range(3, n+1):
tabular[i] = tabular[i-1] + tabular[i-2]
return tabular[n]
Tabulation: μμ SubProblemλΆν° μμν΄μ μ΅μ’ Problem κ²°κ³Όλ₯Ό λμΆν λκΉμ§ κ²°κ³Όλ₯Ό μ°¨λ‘λλ‘ κΈ°λ‘νλ κ².
Recursion | DP: Top-Down | DP: Bottom-Up | |
---|---|---|---|
μκ° λ³΅μ‘λ | O(2^n) | O(n) | O(n) |
β‘οΈΒ DPλ₯Ό μ¬μ©νλ©΄ μ±λ₯ λ©΄μμ κ°μ μ΄ λλ€λ κ²μ μ μ μλ€.
DPλ₯Ό μ¬μ©νκΈ° μν΄μ λ€μκ³Ό κ°μ μ‘°κ±΄μ΄ νμνλ€.
Optimization Problemμ΄ Optimal Substructureμ¬μΌ νλ€.
β Optimization Problemμ Optimal Solutionμ΄ Subproblemμ Optimal Solutionμ ν¬ν¨νλ ꡬ쑰μ¬μΌ νλ€.
μ¦, λΆλΆ λ¬Έμ μ μ΅μ κ²°κ³Ό κ°μ μ¬μ©ν΄ μ 체 λ¬Έμ μ μ΅μ κ²°κ³Όλ₯Ό λΌ μ μλ κ²½μ°λ₯Ό μλ―Ένλ€. (λΆλΆ λ¬Έμ μμ ꡬν μ΅μ κ²°κ³Όκ° μ 체 λ¬Έμ μμλ λμΌνκ² μ μ©λμ΄ κ²°κ³Όκ° λ³νμ§ μμ λ DPλ₯Ό μ¬μ©ν μ μλ€.)
μ: f(n) = f(n-1) + f(n-2)
μ¬κΈ°μ μ£Όμν μ μ, Subproblemsλ λ 립μ μ΄μ΄μΌ νλ€. μ¦, Subproblemμ Solutionμ λ€λ₯Έ Subproblemμ Solutionμ μν₯μ μ£Όλ©΄ μ λλ€λ λ»μ΄λ€.
Optimization Problemμ΄ Overlapping Subproblemsλ₯Ό κ°μ ΈμΌ νλ€.
β μ¬κ·μ ννμ μκ³ λ¦¬μ¦μ΄ λμν λ, λμΌν Subproblemsλ₯Ό μ¬λ¬ λ² ν΄κ²°ν΄μΌ νλ€λ©΄ ν΄λΉ λ¬Έμ λ Overlapping Subproblemsλ₯Ό κ°μ§λ€κ³ νννλ€.
μ¦, λμΌν μμ λ¬Έμ λ€μ΄ λ°λ³΅νμ¬ λνλλ κ²½μ°μ μ¬μ© κ°λ₯νλ€.
λΆν μ 볡과 DPλ, μ£Όμ΄μ§ λ¬Έμ λ₯Ό μκ² μͺΌκ°μ νμ λ¬Έμ λ‘ ν΄κ²°νκ³ μ°κ³μ μΌλ‘ ν° λ¬Έμ λ₯Ό ν΄κ²°νλ€λ μ μ κ°λ€.
νμ§λ§ λΆν μ 볡μ λΆν λ νμ λ¬Έμ κ° λμΌνκ² μ€λ³΅μ΄ μΌμ΄λμ§ μλ κ²½μ°μ μ°λ©°, DPλ λμΌν μ€λ³΅μ΄ μΌμ΄λ κ²½μ° μ΄λ€.
μΌλ°μ μΈ μ¬κ·λ₯Ό λ¨μν μ¬μ© μ λμΌν μμ λ¬Έμ λ€μ΄ μ¬λ¬ λ² λ°λ³΅λμ΄ λΉν¨μ¨μ μΈ κ³μ°μ΄ λ μ μλ€.
κ·Έλ¬λ ν λ² κ΅¬ν μμ λ¬Έμ μ κ²°κ³Ό κ°μ μ μ₯ν΄λκ³ μ¬μ¬μ©νλ€λ©΄, μμμ κ³μ°λ κ°μ λ€μ λ°λ³΅ν νμκ° μμ΄ λ§€μ° ν¨μ¨μ μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκ² λλ€.
DPλ νΉμ ν κ²½μ°μ μ¬μ©νλ μκ³ λ¦¬μ¦μ΄ μλλΌ νλμ λ°©λ²λ‘ μ΄λ―λ‘ λ€μν λ¬Έμ ν΄κ²°μ μ°μΌ μ μλ€.
Bottom-Up λ°©μμ μλμμλΆν° κ³μ°μ μννκ³ , λμ μμΌμ μ 체μ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©μμ΄λ€.
dp[0]κ° κΈ°μ μν(κ°μ₯ μμ λ¬Έμ μ μν)μ΄κ³ , dp[n]μ λͺ©ν μνλΌ ν λ, Bottom-Up λ°©μμ dp[0]λΆν° μμνμ¬ λ°λ³΅λ¬Έμ ν΅ν΄ μ νμμΌλ‘ κ²°κ³Όλ₯Ό λ΄μ dp[n]κΉμ§ κ·Έ κ°μ μ μ΄μμΌ μ¬νμ©νλ λ°©μμ΄λ€.
Top-Down λ°©μμ dp[n]μ κ°μ μ°ΎκΈ° μν΄ μμμλΆν° νΈμΆμ μμνμ¬ dp[0]μ μνκΉμ§ λ΄λ €κ° λ€μ, ν΄λΉ κ²°κ³Ό κ°μ μ¬κ·λ₯Ό ν΅ν΄ μ μ΄μμΌ μ¬νμ©νλ λ°©μμ΄λ€.
μ°Έκ³ μλ£
κ²μ§μΆ© νλ‘κ·Έλλ¨Έ, βμκ³ λ¦¬μ¦ - Dynamic Programming(λμ κ³νλ²)β, https://hongjw1938.tistory.com/47
μ¬μ΄μ½λ, βμ½λ©ν μ€νΈμμ λ§μ΄ μ¬μ©λλ dynamic programming(λ€μ΄λλ―Ή νλ‘κ·Έλλ°, λμ κ³νλ²)μ κ°λ κ³Ό μΈμ μ΄λ»κ² μ¬μ©ν μ μλμ§ λ κ°μ§ μμ λ₯Ό ν΅ν΄ μ΄ν΄λ΄ λλ€~β, https://youtu.be/GtqHli8HIqk