βοΈ λ¬Έμ
μ μ Xμ μ¬μ©ν μ μλ μ°μ°μ λ€μκ³Ό κ°μ΄ μΈ κ°μ§ μ΄λ€.
- Xκ° 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ©΄, 3μΌλ‘ λλλ€.
- Xκ° 2λ‘ λλμ΄ λ¨μ΄μ§λ©΄, 2λ‘ λλλ€.
- 1μ λΊλ€.
μ μ Nμ΄ μ£Όμ΄μ‘μ λ, μμ κ°μ μ°μ° μΈ κ°λ₯Ό μ μ ν μ¬μ©ν΄μ 1μ λ§λ€λ €κ³ νλ€. μ°μ°μ μ¬μ©νλ νμμ μ΅μκ°μ μΆλ ₯νμμ€.
π€ μ μΆλ ₯ μμ
π‘νμ΄
μ λ§ μ λͺ ν DP λ¬Έμ μ€ νλλ‘, μμ§ν λ§ν΄μ λ¬Έμ λ₯Ό λ³Έ μ μ λ§μλ° μ€λμ ν¬ν¨νμ¬ μλ ₯μΌλ‘ νΌ μ μ μλ€. μ°Έ λΆλλ¬μ΄ μΌμ΄μΌ~
μ€λμ DP 곡λΆμ λ λ‘ μ νκΈ° λλ¬Έμ μμ£Ό μΈμΈνκ² μ½λλ₯Ό μ 리ν΄λ³΄λ €κ³ νλ€.
1) μ κ·Ό λ°©λ²
1. DP ν μ΄λΈ μ μ
- 1μ°¨μ λ°°μ΄ ννμ DP ν μ΄λΈ dp[i]μλ iλ₯Ό 1λ‘ λ§λ€κΈ° μν΄ νμν μ΅μ μ°μ° νμ μ μ₯
- μ) dp[3] = 1 (i=3μ΄κ³ 3μΌλ‘ λλλ μ°μ° ν λ²μ΄λ©΄ 1μ΄ λ¨)
2. μ΄κΈ°κ° μ€μ
- dp[1] = 0
- μ²μμ λ¬Έμ ν λ dp[1], dp[2], dp[3] κ°μ λ€ μ£Όκ³ μμνλλ° dp[2], dp[3]μ dp[1]λ§ μλ©΄ forλ¬ΈμΌλ‘ μ²λ¦¬κ° λΌμ κ΅³μ΄ μ΄κΈ°κ°μ μ€ νμλ μμμ
3. β μ νμ μ€μ β
- β dp[i-1]+1 β‘ dp[i//2]+1 β’ dp[i//3]+1 μ΄ μΈ κ°μ§ κ²½μ° μ€ μ΅μκ°μ΄ dp[i]μ μ μ₯λ¨
2) μμ
μ νμ μ€μ λ¨κ³ μ ν μ€μ μ΄ν΄νλ λ°μ λ무λ μ€λ κ±Έλ € λ²λ¦° λμ λλ,, μ±μ§νΌν°λκ»μ μΉμ ν μμ±ν΄μ€ μμλ μλμ κ°λ€.
β dp[i-1]+1
iκ° 2μ 3 κ·Έ μ΄λ κ²μΌλ‘λ λλμ΄ λ¨μ΄μ§μ§ μλ μλΌκ³ κ°μ ν΄λ³΄μ. μ¦, `i=5`λΌκ³ νμ λ `dp[5]=dp[4]+1`μ΄λΌκ³ ν μ μλλ° μ‘°κΈ λ νμ΄ μ°λ©΄ `dp[5] = dp[4](4λ₯Ό 1λ‘ λ§λ€κΈ° μν΄ νμν μ°μ° νμ)+1(5μμ 1μ λΊ ν 4λ‘ κ°λ μ°μ° νμ)`μ΄λ€.
β‘ dp[i//2]+1
iκ° 2λ‘ λλμ΄μ§λ κ²½μ°μΈ `i=8`μ μκ°ν΄λ³΄μ. μ΄λ¬ν κ²½μ°μλ `dp[8] = dp[4](4λ₯Ό 1λ‘ λ§λ€κΈ° μν΄ νμν μ°μ° νμ)+1(8μμ 2λ₯Ό λλ 4λ‘ κ°λ μ°μ° νμ)`μ΄λΌλ μμ΄ μ±λ¦½νκ² λλ€.
dp[i//3]+1λ μμ λ λ°©μκ³Ό λμΌνκΈ° λλ¬Έμ μλ΅!
3) μ½λ
import sys
N = int(sys.stdin.readline().strip())
dp = [0]*(N+1)
for i in range(2, N+1):
dp[i] = dp[i-1]+1
# iκ° 2λ‘ λλ λ¨μ΄μ§λ κ²½μ°
if i%2 == 0:
dp[i] = min(dp[i], dp[i//2]+1)
# iκ° 3μΌλ‘ λλ λ¨μ΄μ§λ κ²½μ°
if i%3 == 0:
dp[i] = min(dp[i], dp[i//3]+1)
print(dp[N])
μ νμ μ€μ λ¨κ³ λ§κ³ μ½λ ꡬν λ¨κ³μμλ νλ λ°λͺ© μ‘νλ λΆλΆμ΄ μλλ° 'μ dp[i] = dp[i-1]+1κ° λ¨Όμ λμ€μ§?'λ₯Ό μ΄ν΄ λͺ» νμλ€.
κ·Όλ° μ΄λ €μ΄ λΆλΆμ μλμκ³ κ·Έλ₯ 'β dp[i-1]+1 β‘ dp[i//2]+1 β’ dp[i//3]+1 μ΄ μΈ κ°μ§ κ²½μ° μ€ μ΅μκ°'μ ꡬνκΈ° μν΄ 1μ λΉΌλ κ³Όμ μ κ°μ 미리 μ μ₯ν΄λλ κ±°μλ€. 1μ λΉΌλ κ³Όμ μ 2λ‘ λλ μ§κ±°λ 3μΌλ‘ λλ μ§λ κ±Έ μκ°νμ§ μκ³ λͺ¨λ κ°μ 곡ν΅μΌλ‘ μ μ©λ μ μλ κ²μ΄κΈ° λλ¬Έμ κ°μ₯ λ¨Όμ μ²λ¦¬ν΄μ£Όλ κ²μ΄μμ
π€ μ°Έκ³
μκ°λ λͺ»νλλ° νμ΄ μ’ μ°Ύμλ³΄λ€ λ³΄λκΉ μ΄ λ¬Έμ λ κ²°κ΅ μ΅μκ°μ ꡬνλ κ±°λΌ BFSλ‘ νΌ λΆλ€λ κ½€ λ§μλ€. κ·Έλ¦¬κ³ μ΄ λ¬Έμ λ BFSλ‘ μ½λ μ μΆνλκΉ DP λ°©μλ³΄λ€ μν μλκ° ν¨μ¬ λΉ¨λΌμ μ±μ°νΌν°νν μ΄μ λ₯Ό λ¬Όμ΄λ΄€λλ° μ€λͺ μ μμ½νμλ©΄
"DPλ λͺ¨λ μμ λν΄ μ°μ°μ μ§ννμ§λ§ BFSλ μ£Όμ΄μ§ 1λ‘ λλ¬νκΈ°κΉμ§ νμν μμ λν΄μλ§ μ°μ°μ μ§ν"
νκΈ° λλ¬Έμ BFSκ° λ λΉ λ¦ μ΄μλ€. BFS ꡬν μ½λλ μλμ ν¨κ» λ£μ΄λλ€.
import sys
from collections import deque
def bfs_min_operations(n):
queue = deque([(n, 0)]) # (νμ¬ μ«μ, μ°μ° νμ)
visited = set() # λ°©λ¬Έν μ«μλ€μ μ μ₯
visited.add(n)
while queue:
current, operations = queue.popleft()
# νμ¬ μ«μκ° 1μ΄λΌλ©΄, μ°μ° νμλ₯Ό λ°ν
if current == 1:
return operations
# 1μ λΉΌλ κ²½μ°
if current - 1 > 0 and current - 1 not in visited:
queue.append((current - 1, operations + 1))
visited.add(current - 1)
# 2λ‘ λλλ κ²½μ°
if current % 2 == 0 and current // 2 not in visited:
queue.append((current // 2, operations + 1))
visited.add(current // 2)
# 3μΌλ‘ λλλ κ²½μ°
if current % 3 == 0 and current // 3 not in visited:
queue.append((current // 3, operations + 1))
visited.add(current // 3)
N = int(sys.stdin.readline().strip())
print(bfs_min_operations(N))
μ DP μνκ³ μΆμ΄λΌ ~
'Problem Solving > BOJ & Programmers' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ] 7568λ²: λ©μΉ (0) | 2024.09.09 |
---|---|
[BOJ] 9095λ²: 1, 2, 3 λνκΈ° (0) | 2024.09.03 |
[BOJ] 11399λ²: ATM (0) | 2024.08.27 |
[BOJ] 2839λ²: μ€ν λ°°λ¬ (1) | 2024.08.27 |
[BOJ] 2217λ²: λ‘ν (1) | 2024.02.25 |