ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90

๐Ÿšฉ ๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP)

 

thinking

1. ๊ทœ์น™์„ ์ฐพ์•„๋ณด๋ ค ํ–ˆ์œผ๋‚˜ ์‹คํŒจ -> ๊ทœ์น™ ์—†์Œ !

2. DP ์ ‘๊ทผ

์ธํ’‹์ˆซ์ž์˜ ํฌ๊ธฐ๋งŒํผ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ณ„์‚ฐํšŸ์ˆ˜๋ฅผ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ž…๋ ฅ & ๋น„๊ตํ•˜๋ฉด์„œ ์ตœ์†Œ ์—ฐ์‚ฐ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์•ž์—์„œ ๋ถ€ํ„ฐ ๊ณ„์‚ฐ์„ ํ•ด๊ฐ€๋ฉด์„œ ์นด์šดํŒ…์„ ๋Š˜๋ ค๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค !

โ—พ   ์ ํ™”์‹ : dp(N) = min ( dp(N//3)+1, dp(N//2)+1 , dp(N-1)+1 )  

โ—พ  ์‹œ๊ฐ„๋ณต์žก๋„ : {๋ฐฐ์—ด์˜ ํฌ๊ธฐ x O(1)} => O(N)  

 

์ฝ”๋“œ

N = int(input())

dp = [0 for _ in range(N+1)]  # ์ธ๋ฑ์Šค๊ฐ€ N์ด ๋˜๋„๋ก N+1 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ฆ

for i in range(2, N+1):
    dp[i] = dp[i-1] + 1  # dp(N-1)+1 ๊ณ„์‚ฐ๋จผ์ € ํ•ด์ฃผ๊ณ 

    if i % 2 == 0 and dp[i] > dp[i//2] + 1:  # 2๋กœ ๋‚˜๋ˆ ์ง€๋ฉด์„œ ์นด์šดํŒ…ํšŸ์ˆ˜๊ฐ€ ์ „๋ณด๋‹ค ํฌ๋ฉด ๋ฐ”๊พธ๊ธฐ
        dp[i] = dp[i//2] + 1

    if i % 3 == 0 and dp[i] > dp[i//3] + 1:  # 3์œผ๋กœ ๋‚˜๋ˆ ์ง€๋ฉด์„œ ์นด์šดํŒ…ํšŸ์ˆ˜๊ฐ€ ์ „๋ณด๋‹ค ํฌ๋ฉด ๋ฐ”๊พธ๊ธฐ
        dp[i] = dp[i//3] + 1

print(dp[N])  # == print(dp[-1])

 

๋Œ“๊ธ€