๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ( ๋์ ๊ณํ๋ฒ ) ์ด๋?
ํ ๋ฒ ์ฐ์ฐ๋ ๊ฐ์ ๋ฐ๋ณตํ์ฌ ์ฐ์ฐํ์ง ์๋๋ก ์ด๋ฏธ ์ฐ์ฐ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
๋ํ์ ์ธ ์ : ํผ๋ณด๋์น ์์ด
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ํ์ ์ธ ์๋ก๋ ํผ๋ณด๋์น ์์ด์ด ์๋ค.
์์ ๊ฐ์ด ์ ์๊ฐ ๋ ํผ๋ณด๋์น ์์ด์
F(3) = F(1) + F(2)
F(4) = F(2) + F(3)
...
์ผ๋ก ๊ณ์ฐ์ด ๋๋ฏ๋ก ๋ฐ๋ณต์ ์ธ ๊ณ์ฐ์ด ๋์จ๋ค.
์ด์ ์ ๊ณ์ฐ๋ F(3)์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด ๋๋ค๋ฉด, F(4)๋ฅผ ๊ณ์ฐํ ๋, F(3)์ ๋ค์ ๊ณ์ฐํ์ง ์์๋ ๋๋ค.
๋ฌธ์ ํ์ด ๋ฐฉ์
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ํ์ด ๋ฐฉ์์ ๋๊ฐ์ง๋ก ๋๋๋ค.
ํ๋ค์ด ๋ฐฉ์ ( Top-Down ๋ฐฉ์ )
ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์ฌ๊ทํจ์๋ก ํธ๋ ๋ฐฉ๋ฒ์ด๋ค. ( ํํฅ์ ๋ฐฉ๋ฒ )
ํ๋ค์ด์ ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋๋ฐ, ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ด๋ ํ๋ฒ ๊ตฌํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฉ๋ชจํด๋๊ณ ๊ฐ์ ์์ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋ชจํ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฒ์ด๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ ์บ์ฑ(Caching)์ด๋ผ๊ณ ๋ ํ๋ค.
์์ ํผ๋ณด๋์น ์์ด์ ํ๋ค์ด ๋ฐฉ์์ผ๋ก ํ์ด๋ณด์.
var dp = [Int](repeating: 0, count: 101)
dp[1] = 1
dp[2] = 1
//ํผ๋ณด๋์น ์์ด
func fibo(_ n: Int) -> Int {
if dp[n] != 0 {
return dp[n]
}
dp[n] = fibo(n-1) + fibo(n-2)
return dp[n]
}
๋ณดํ ์ ๋ฐฉ์ ( Bottom-Up ๋ฐฉ์ )
์์ ๋ฌธ์ ๋ฅผ ๋จผ์ ํด๊ฒฐํ๊ณ , ํด๊ฒฐ๋ ์์ ๋ฌธ์ ๋ฅผ ๋ชจ์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก for๋ฌธ์ผ๋ก ํธ๋ ๋ฐฉ๋ฒ์ด๋ค. ( ์ํฅ์ ๋ฐฉ๋ฒ )
ํ๋ค์ด ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ ์์ ์์์ ํฐ ์๋ก ์ฌ๋ผ๊ฐ๋ฉฐ ๊ณ์ฐํ๋ค. ์ด ๋ฐฉ์์์ ์ฌ์ฉ๋๋ ๋ฐฐ์ด์ DP ํ ์ด๋ธ ์ด๋ผ๊ณ ํ๋ค.
์์ ํผ๋ณด๋์น ์์ด์ ๋ณดํ ์ ๋ฐฉ์์ผ๋ก ํ์ด๋ณด์.
var dp = [Int](repeating: 0, count : 101)
dp[1] = 1
dp[2] = 1
func fibo(_ n: Int) -> Int {
for i in 3...n {
dp[i] = dp[i-1] + dp[i-2]
}
return dp[n]
}
ํ๋ค์ด์ ์ฐ์ด๋ ์ฌ๊ท ํจ์์ ์คํ ํฌ๊ธฐ๊ฐ ํ์ ๋์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณดํต ํ๋ค์ด ๋ฐฉ์๋ณด๋ค๋ ๋ณดํ ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ๋ ๊ถ์ฅํ๋ค.
์์๋ฌธ์
๋ฐฑ์ค 1463๋ฒ : 1๋ก ๋ง๋ค๊ธฐ
https://www.acmicpc.net/problem/1463
1463๋ฒ: 1๋ก ๋ง๋ค๊ธฐ
์ฒซ์งธ ์ค์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 106๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์ N์ด ์ฃผ์ด์ง๋ค.
www.acmicpc.net
ํ์ด ๋ฐฉ๋ฒ
let x = Int(readLine()!)!
var dp = [Int](repeating: 0, count: x+1)
for i in 2..<x+1 {
dp[i] = dp[i-1] + 1
if i % 2 == 0 {
dp[i] = min(dp[i], dp[i/2] + 1)
}
if i % 3 == 0 {
dp[i] = min(dp[i], dp[i/3] + 1)
}
}
print(dp[x])