μ€λ³΅λλ μ°μ°μ μ€μ΄μ
μ»΄ν¨ν°λ μ°μ° μλμ νκ³κ° μκ³ , λ©λͺ¨λ¦¬ 곡κ°μ μ¬μ©ν μ μλ λ°μ΄ν° κ°μλ νμ μ μ΄λ€.
λ°λΌμ μ°λ¦¬λ μ°μ° μλμ λ©λͺ¨λ¦¬ 곡κ°μ μ΅λν νμ©ν μ μλ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦μ΄ νμμ μ΄λ€.
νλ‘κ·Έλλ°μμ 'λ€μ΄λλ―Ή'μ΄λ, 'νλ‘κ·Έλ¨μ΄ μ€νλλ λμ€μ'λΌλ μλ―Έμ΄λ€. (ex. λμ ν λΉ)
κ·Έλ¬λ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ΄μ κ΄λ ¨μ΄ μλ€.
# μμ
λ€μ΄λλ―Ή νλ‘κ·Έλλ°μΌλ‘ ν΄κ²°ν μ μλ λνμ μΈ μμλ‘ νΌλ³΄λμΉ μμ΄μ΄ μλ€.
$$a_n = a_{n-1} + a_{n-2}, a_1 = 1, a_2 = 1$$
κ·ΈλΌ, μ½λλ‘λ μ΄λ»κ² ꡬνν μ μμκΉ?
κ°μ₯ μ½κ² μκ°ν μ μλ λ°©λ²μ λ°λ‘ μ¬κ·ν¨μμΌ κ²μ΄λ€.
κ·Έλ¬λ μ½λλ₯Ό μ΄μ κ°μ΄ μ§λ©΄ μ¬κ°ν λ¬Έμ κ° μκΈ΄λ€.
λ°λ‘ nμ΄ μ»€μ§λ©΄ 컀μ§μλ‘ μνμκ°μ΄ κΈ°νκΈμμ μΌλ‘ μ¦κ°νλ κ²μ΄λ€.
μ΄ μ½λμ μκ° λ³΅μ‘λλ $$O(2^N)$$μ΄κΈ° λλ¬Έμ΄λ€.
$$N=30$$μ΄λ©΄, μ½ 10μ΅ κ°λμ μ°μ°μ μνν΄μΌ νλ€λ©΄ λμ± κ°μ΄ μ‘ν κ²μ΄λ€.
$$f(6)$$μΌ λμ νΈμΆ κ³Όμ μ μλμ κ°μ΄ μκ°νν μ μλλ°,
μ΄λ μμΈν 보면 λμΌν ν¨μκ° λ°λ³΅μ μΌλ‘ νΈμΆλλ κ²μ μ μ μλ€.
$$f(6)$$μ νΈμΆνλλ° $$f(3)$$μ λ¬΄λ € 3λ²μ΄λ νΈμΆλ κ²μ΄λ€.
μ΄μ²λΌ νΌλ³΄λμΉ μμ΄μ μ¬κ· ν¨μλ₯Ό μ¬μ©ν΄ λ§λ€ μλ μμ§λ§,
λ¨μν λ§€λ² κ³μ°νλλ‘ νλ건 λ¬Έμ λ₯Ό ν¨μ¨μ μΌλ‘ νμ§ λͺ»νλ€.
λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ¬μ©νλ©΄ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μλλ°
μ΄ νλ‘κ·Έλλ°μ νμ μ¬μ©ν μ μλ κ²μ μλλ€. μλ λ κ°μ§ μ‘°κ±΄μ΄ μ μλμ΄μΌ νλ€.
[μ μ ]
1. ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλ μ μλ€.
2. μμ λ¬Έμ μμ ꡬν μ λ΅μ κ·Έκ²μ ν¬ν¨νλ ν° λ¬Έμ μμλ λμΌνλ€
νΌλ³΄λμΉ λ¬Έμ λ₯Ό μ¬κ·ν¨μκ° μλ, λ©λͺ¨μ΄μ μ΄μ (Memoization) κΈ°λ²μ μ¬μ©νμ¬ ν΄κ²°ν΄λ³΄μ!
λ©λͺ¨μ΄μ μ΄μ (Memoization) = μΊμ±(Caching)
: λ€μ΄λλ―Ή νλ‘κ·Έλλ° κΈ°λ² μ€ νλλ‘
νλ² κ΅¬ν κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬ 곡κ°μ λ©λͺ¨ν΄λκ³ κ°μ μμ λ€μ νΈμΆνλ©΄
λ©λͺ¨ν κ²°κ³Όλ₯Ό κ·Έλλ‘ κ°μ Έμ€λ κΈ°λ²
ꡬν λ°©λ²
: ν λ² κ΅¬ν μ 보λ₯Ό 리μ€νΈμ μ μ₯
: μ¬κ·μ μΌλ‘ μννλ€κ° κ°μ μ λ³΄κ° νμν λ μ λ΅μ κ·Έλλ‘ λ¦¬μ€νΈμμ κ°μ Έμ€λ©΄ λ¨
μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ μλμ κ°λ€.
$$d$$ 리μ€νΈμλ ν λ² κ΅¬ν μ 보μΈμ§ μλμ§μ λν μ λ³΄κ° λ΄κ²¨μλ κ²μ΄λ€.
λ¬Έμ λ₯Ό μκ² λλλ€κ³ ? ν΅ μ λ ¬μ λΆν μ 볡 μκ³ λ¦¬μ¦κ³Ό λΉμ·ν΄λ³΄μ΄λλ°?
λΉμ·νμ§λ§,
ν΅ μ λ ¬μ νλ² κΈ°μ€ μμ Pivotκ° μ리λ₯Ό λ³κ²½ν΄μ μ리λ₯Ό μ‘κ² λλ©΄
κ·Έ κΈ°μ€ μμμ μμΉλ λ μ΄μ λ°λμ§ μκ³ κ·Έ νΌλ²κ°μ λ€μ μ²λ¦¬νλ λΆλΆ λ¬Έμ λ μ‘΄μ¬νμ§ μλλ€.
κ·Έμ λ°ν΄ λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ νλ² ν΄κ²°νλ λ¬Έμ λ₯Ό λ€μκΈ ν΄κ²°νλ€.
λ©λͺ¨μ΄μ μ΄μ λ°©λ²μ μ¬μ©ν μκ³ λ¦¬μ¦μ μκ°νν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
$$f(6)$$μ νΈμΆν λ, μ΄μ λ μλμ²λΌ ν¨μ¬ νΈμΆ νμκ° μ€μλ€.
λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μν΄ νΌλ³΄λμΉ μμ΄ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ $$O(N)$$μΌλ‘ μ€μλ€.
μ΄μ²λΌ μ¬κ·ν¨μλ₯Ό μ΄μ©ν΄μ λ€μ΄λλ―Ή νλ‘κ·Έλλ° μμ€μ½λλ₯Ό μμ±νλ λ°©λ²μ,
ν° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μμ λ¬Έμ λ₯Ό νΈμΆνλ€κ³ νμ¬ νλ€μ΄Top-Down = μν₯μ λ°©μμ΄λΌκ³ λ§νλ€.
λ°λ©΄μ, λ¨μν λ°λ³΅λ¬Έμ μ΄μ©νμ¬ μμ€μ½λλ₯Ό μμ±νλ κ²½μ°
μμ λ¬Έμ λΆν° μ°¨κ·Όμ°¨κ·Ό λ΅μ λμΆνλ€κ³ νμ¬ λ³΄ν μ Botton-Up = νν₯μ λ°©μμ΄λΌκ³ νλ€.
보ν μ Bottom-Up λ°©λ²μ μ¬μ©ν΄μ ν΄κ²°ν μ½λλ μ΄μ κ°λ€. ν¨μ¬ κ°λ¨ν λ―!
λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ μ νμ μΈ ννλ 보ν μ Bottom-Up λ°©μμ΄λ€.
보ν μ λ°©μμμ μ¬μ©λλ κ²°κ³Ό μ μ₯μ© λ¦¬μ€νΈλ 'DP ν μ΄λΈ'μ΄λΌκ³ λΆλ₯΄κ³ ,
λ©λͺ¨μ΄μ μ΄μ μ νλ€μ΄ λ°©μμμ κ΅νλμ΄ μ¬μ©λλ ννμ΄λ€.
# λ¬Έμ νΈλ λ°©λ²
1. μ£Όμ΄μ§ λ¬Έμ κ° λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ νμμ νμ νκΈ°
2. μμ νμ μκ³ λ¦¬μ¦μΌλ‘ μ κ·Όνμ λ μκ°μ΄ λ§€μ° μ€λ 걸리면 > λ€μ΄λλ―Ή νλ‘κ·Έλλ° μ μ© κ°λ₯ν κΉ?
3. μ¬κ· ν¨μλ‘ λΉν¨μ¨μ μΈ νλ‘κ·Έλ¨ μμ± (νλ€μ΄) > μ½λ κ°μ -- λ©λͺ¨μ μ΄μ λ°©λ² μ¬μ©
4. 3λ² λ³΄λ€λ 보ν μ λ°©μμΌλ‘ ꡬννλ κ²μ κΆμ₯, μ€ν ν¬κΈ°κ° νμ λμ΄ μμ μ μκΈ° λλ¬Έ
# 2-1. 1λ‘ λ§λ€κΈ°
import sys
X = int(input())
d = [0]*(X+1)
for i in range(2, X+1):
d[i] = d[i-1] + 1
if i%5 == 0:
d[i] = min(d[i], d[i//5]) + 1
elif i%3 == 0:
d[i] = min(d[i], d[i//3]) + 1
elif i%2 == 0:
d[i] = min(d[i], d[i//2]) + 1
print(d[X])
ν¨μκ° νΈμΆλλ κ³Όμ μ 그리면 μ½λλ₯Ό μ§λκ² λ κ°λ¨ν΄μ§λ€.
μ°λ¦¬λ $$X$$κ° μμ λ (λ§μ½ xκ° 2,3,5μ λͺ¨λ λλμ΄λ¨μ΄μ§λ€λ©΄..)
$$f(X) = f(X-1) + 1$$
$$f(X) = f(X//2) + 1$$
$$f(X) = f(X//3) + 1$$
$$f(X) = f(X//5) + 1$$
μ΄ μ€μ κ°μ₯ μμ κ°μ μ·¨νκ² λλ€. μ νμμΌλ‘ νννλ©΄, $$a_i = min(a_{i-1}, a_{i/2}, a_{i/3}, a_{i/5})$$
# 2-2. κ°λ―Έμ μ¬
import sys
N = int(sys.stdin.readline().strip())
array = list(map(int,sys.stdin.readline().split()))
d = [0]*(N)
d[0] = array[0]
d[1] = max(array[0], array[1])
for i in range(2, N):
d[i] = max(d[i-1], d[i-2]+array[i])
print(d[N-1])
νμ¬ μμΉμμ μ΄λ€ μλ μ°½κ³ λ₯Ό νΈμ§λ μλμ²λΌ (1) λ°λ‘ μ§μ κ³Ό (2) μ μ μ νμΈνλ©΄ λλ€.
μ΄λ₯Ό ννν μ νμμ λ€μκ³Ό κ°λ€. $$a_i = max(a_{i-1}, a_{i-2} + k_i)$$
# 2-3. λ°λ₯ 곡μ¬
import sys
N = int(sys.stdin.readline().strip())
d = [0]*(N+1)
d[1] = 1
d[2] = 3
for i in range(3, N+1):
d[i] = d[i-1] + (d[i-2] * 2)
print(d[N])
μ νμμ νννλ©΄ λ€μκ³Ό κ°λ€ $$a_i = a_{i+1} + a_{i-2}*2$$
# 2-4. ν¨μ¨μ μΈ νν ꡬμ±
import sys
N, M = map(int,sys.stdin.readline().split())
coins = [int(sys.stdin.readline().strip()) for _ in range(N)]
d = [10001]*(M+1)
d[0] = 0
for i in range(N):
for j in range(coins[i], M+1):
if d[j-coins[i]] != 10001:
d[j] = min(d[j], d[j-coins[i]]+1)
if d[M] == 10001:
print(-1)
else:
print(d[M])
κΈμ‘ $$i$$λ₯Ό λ§λ€ μ μλ μ΅μνμ νν κ°μ: $$a_i$$, ννμ λ¨μ: $$k$$
- $$a_{i-k}$$λ₯Ό λ§λλ λ°©λ²μ΄ μ‘΄μ¬νλ κ²½μ°: $$a_i = min(a_i, a_{i-k}+1)$$
- $$a_{i-k}$$λ₯Ό λ§λλ λ°©λ²μ΄ μ‘΄μ¬νμ§ μλ κ²½μ°: $$a_i=10,001$$
μλ₯Ό λ€μ΄, $$N=3, K=7$$μ΄κ³ , κ° ννμ λ¨μκ° $$2,3,5$$μΈ κ²½μ°λ₯Ό μκ°ν΄λ³΄μ!
step0: μ΄κΈ°ν
νΉμ κΈμ‘μ λ§λ€ μ μλ νν ꡬμ±μ΄ κ°λ₯νμ§ μλ€λ μλ―Έλ‘ = 10,001 κ° μ€μ
step1: νν λ¨μ 2λΆν° μ νμμ νμΈνκΈ° μμνλ€.
$$a_2 = a_0 + 1 = 0 + 1 = 1$$
$$a_4 = a_2 + 1 = 1 + 1 = 2 $$
$$a_6 = a_4 + 1 = 2 + 1 = 3 $$
λ€μ μ νμμ μν΄ νλ₯Ό μ±μ λ£μ μ μλ€.
step2: κ·Έ λ€μμ νν λ¨μ 3μ νμΈνκΈ° μμνλ€.
$$a_3 = a_0 + 1 = 0 + 1 = 1$$
$$a_6 = a_3 + 1 = 1 + 1 = 2 $$ (update!)
$$a_7 = a_4 + 1 = 2 + 1 = 3 $$
λ€μ μ νμμ μν΄ νλ₯Ό μ±μ λ£μ μ μλ€.
step3: λ§μ§λ§μΌλ‘, νν λ¨μ 5μ νμΈνκΈ° μμνλ€.
$$a_5 = a_0 + 1 = 0 + 1 = 1$$
$$a_7 = a_2 + 1 = 1 + 1 = 2 $$ (update!)
λ€μ μ νμμ μν΄ νλ₯Ό μ±μ λ£μ μ μλ€.
'π Study > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Algorithm] νμ μκ³ λ¦¬μ¦ DFS, BFS (0) | 2025.04.06 |
---|---|
[Algorithm] μ΅λ¨ κ²½λ‘ (0) | 2025.04.05 |
[Algorithm] 그리λ(Greedy) μκ³ λ¦¬μ¦ κΈ°μΆλ¬Έμ (0) | 2024.06.26 |
[Algorithm] 그리λ(Greedy) μκ³ λ¦¬μ¦ (0) | 2024.06.26 |
[μκ³ λ¦¬μ¦] 2μ£Όμ°¨ κ°μ | μ°μ μμ ν ADT, μ μ리 μ νμ λ ¬, μ μ리 μ½μ μ λ ¬ (2) | 2022.09.10 |