✔ 풀이를 위한 아이디어
✔ 수정 전 코드
import sys
def make_one(x, count):
if x == 1:
print(count)
return
if x == 2:
x = x // 2
elif x % 3 == 0:
x = x // 3
elif (x & (x-1)) == 0: #2의 n제곱 판별
x = x // 2
elif x % 3 == 1:
x = x - 1
elif x % 3 == 2 and x % 2 == 0:
x = x // 2
elif x % 3 == 2 and x % 2 == 1:
x = x - 1
count += 1
make_one(x, count)
if __name__=="__main__":
X = int(sys.stdin.readline())
count = 0
make_one(X, count)
✔ 수정 후 코드
X = int(input())
dp = [-1, 0, 1, 1]
#점화식: dp[N] = min(dp[N-1], dp[N//2] , dp[N//3]) + 1
for i in range(4, X+1):
dp.append(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])
처음으로 풀어본 DP 문제!
✔ 관련 개념