๋ฌธ์ ๋งํฌ : https://www.acmicpc.net/problem/1463
๋ฌธ์ ๋ถ๋ฅ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
https://infinitt.tistory.com/246
์ฒ์์ ๋น์ฐ์ค๋ฝ๊ฒ ์กฐ๊ฑด๋ฌธ์ ํตํด ๊ตฌํํ๋ค. (n//3 , n//2 , n-=1 ์์๋๋ก).
ํ์ง๋ง ๋ฌธ์ ์ ํ
์คํธ์ผ์ด์ค์ธ 10์ด ๋ฐ๋ก์๋ค.
์ฆ, ๋จ์ํ ์กฐ๊ฑด๋ฌธ์ผ๋ก ํ๊ฒ๋๋ฉด 10 - > 5 -> 4 -> 2 -> 1 ์ด์ง๋ง, ์ฌ์ค 10์
10 -> 9 -> 3 - > 1 ์ผ๋ก, n/3๋ณด๋ค n-1์ ๋จผ์ ํด์ค์ผ ์ต์๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ ๋จ์ ๊ตฌํ์ด ์๋๋ผ, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํ์ด์ผ ํ๋ค.
- N์ด๋ผ๋ ์๋ N//3์ ์ฐ์ฐ์ ์ผ๋ก ๋๋ฆฌ๋ฉด, ์ฆ +1์ ํ๋ฉด ๋ง๋ค ์ ์๋ค.
- N์ด๋ผ๋ ์๋ N//2์ ์ฐ์ฐ์ ์ผ๋ก ๋๋ฆฌ๋ฉด, ์ฆ +1์ ํ๋ฉด ๋ง๋ค ์ ์๋ค.
- N์ด๋ผ๋ ์๋ N-1์ ์ฐ์ฐ์ ์ผ๋ก ๋๋ฆฌ๋ฉด, ์ฆ +1์ ํ๋ฉด ๋ง๋ค ์ ์๋ค.
๋ฐ๋ผ์ !!! ์ ํ์ : dp(N) = min ( dp(N//3) +1, dp(N//2)+1 , dp(N-1)+1 )
*์ ๋ต ์ฝ๋ (Python)
n = int(input())
dp = [0 for _ in range(n+1)]
for i in range(2, n+1):
dp[i] = dp[i-1] + 1
if i%2 == 0 and dp[i] > dp[i//2] + 1 :
dp[i] = dp[i//2]+1
if i%3 == 0 and dp[i] > dp[i//3] + 1 :
dp[i] = dp[i//3] + 1
print(dp[n])
- n+1๊ฐ๋งํผ์ 0์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋ค.
- dp๋ผ๋ ๋ฐฐ์ด์ index๋ ๋ฌธ์ ์ ์
๋ ฅn๊ณผ ๋์ํ๊ณ , index์ ๊ฐ์ ์ฐ์ฐ์ต์๊ฐ(๋ฌธ์ ์ ์ถ๋ ฅ)์ ๋์ํ๊ฒ๋๋ค.
* ์๊ฐ๋ณต์ก๋
๋ฐฐ์ด์ ํฌ๊ธฐ * O(1)์ด๋ค. (๋ฐฐ์ด ํ๋๋น O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฏ๋ก)
๋ฐฐ์ด์ n+1์ด๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ O(n)