๋ฐ์ํ
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1463
๋ด๊ฐ ํผ ํ์ด
- bottom up ๋ฐฉ์์ผ๋ก ๋ฌธ์ ํ์ด
- dp ๋ฐฐ์ด์ ์ธ๋ฑ์ค๊ฐ ์ซ์๋ฅผ ๋ปํ๊ณ , value๊ฐ ๊ทธ ์ธ๋ฑ์ค๊น์ง ๋๋ฌํ ๋ ์ต์ ๊ฒฝ์ฐ์ ์์ด๋ค. ์ฆ, dp ๋ฐฐ์ด์๋ ๊ทธ ์ซ์๊น์ง ๋๋ฌํ ๋์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํด๋๋ ๊ฒ์ด๋ค.
- 1๋ฒ๊ท์น (3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ค) dp[n] = d[n/3] +1 ๋ฐ๋ก ์ง์ (3์๋ฐฐ์๋๊น n/3) ๊ฒฝ์ฐ์ ์ ์์ 1์ ๋ํด์ฃผ๋ ๊ฒ
- 2๋ฒ๊ท์น (2๋ก ๋๋์ด ๋จ์ด์ง๋ค) dp[n] = dp[n/2] +1
- 3๋ฒ๊ท์น (1์ ๋บ๋ค) dp[n] = dp[n-1]+1 1์ ๋นผ๋ ๊ฑด, ๋จ์ง ๋ฐ๋ก ์ ์ซ์์์ ์ฐ์ฐ์ ํ๋ ๊ฒ์ด๋ผ n-1์ด๊ณ , 1์ ๋บ๋ค๋ ๊ฒฝ์ฐ๋ฅผ ๋ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ +1์ด๋ค. (์ฃผ์: ๋ฐฐ์ด์ value๋ ๊ฒฝ์ฐ์ ์์ด๋ค)
- ์์ ๋ฌธ์ ๋ถํฐ ํฐ๋ฌธ์ ๋ก ํ์ด๊ฐ๋ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐ. ๊ทธ๋์ ๋ฐฐ์ด์ ํ์ฉํจ. (1์์ 2๋ก๊ฐ๋์ ๊ฒฝ์ฐ์์ ์ค ๊ฐ์ฅ ์์ ๊ฒฝ์ฐ์ ์, 2์์ 3์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ์ ์ ์ค ๊ฐ์ฅ ์์ ๊ฒฝ์ฐ์์,,, ๊ทธ๋์ for ๋ฌธ์ ํ์ฉํ๋ค)
let n = Int(readLine()!)!
var dp = [Int](repeating: 0, count: n+1)
for i in 2..<n+1 {
dp[i] = dp[i-1] + 1
if i % 3 == 0 {
dp[i] = min(dp[i], dp[i/3]+1)
}
if i % 2 == 0 {
dp[i] = min(dp[i], dp[i/2]+1)
}
}
print(dp[n])
์ฐ์ ๋์ ๊ณํ๋ฒ (๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, DP) ์ ๋ํ ๊ฐ๋ ์ด ์ ํ ์์๊ธฐ ๋๋ฌธ์, ์ธํฐ๋ท์ ํ์ ์กฐ๊ธ ๋น๋ ค ๋ฌธ์ ๋ฅผ ํ์๋ค. ์๋ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ํ์ดํ๊ธฐ ์ ์ ๋ด๊ฐ ์ ๋ฆฌํด๋ dp ๊ด๋ จ ํฌ์คํ ์ ์ฐ์ ์ต๋ ํ ํ, ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (๋์ ๊ณํ๋ฒ, DP) ๊ธฐ๋ณธ ๊ฐ๋ ๊ณต๋ถํ๊ธฐ
๋ง์ฐํ๊ฒ ํผ๋ณด๋์น ํจ์๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ ์ ๊ณต๋ถํ๋ค๊ณ ๋ฌธ์ ๊ฐ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ํ๋ฆฌ์ง ์์๋ค. ์ญ์๋ ๊ฐ๋ ์ ์๊ณ , ์ด๊ฒ์ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ๋ ๋ง์ ์ฐ์ต๊ณผ ๋ฌธ์ ํ์ด, ๋ ธ๋ ฅ์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
๋ฐ์ํ