본문 바로가기
Tech/Coding

1463번 1로 만들기

by redcubes 2024. 2. 28.
def counter(n):
    dp = [0] * (n + 1)

    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + 1

        if i % 2 == 0:
            dp[i] = min(dp[i], dp[i // 2] + 1)

        # 3으로 나누어 떨어지는 경우
        if i % 3 == 0:
            dp[i] = min(dp[i], dp[i // 3] + 1)

    return dp[n]

n = int(input())
print(counter(n))

숫자 i를 1로 만들 수 있는 최소 계산 횟수를 dp[i] 라고 정의하면,

기본적으로 +1연산에 의해 1개씩 증가하고,

2로 나누어떨어지는 i의 경우 2분의 1 위치의 dp에 1을 더한 방법과 이전 수에 1을 더한 방법 중 최소 횟수를 저장한다.

3로 나누어떨어지는 i의 경우 3분의 1 위치의 dp에 1을 더한 방법과 이전 수에 1을 더한 방법 중 최소 횟수를 저장한다.

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0]

[0, 0, 1, 1, 2, 3, 0, 0, 0, 0, 0]

[0, 0, 1, 1, 2, 3, 2, 0, 0, 0, 0]

[0, 0, 1, 1, 2, 3, 2, 3, 0, 0, 0]

[0, 0, 1, 1, 2, 3, 2, 3, 3, 0, 0]

[0, 0, 1, 1, 2, 3, 2, 3, 3, 2, 0]

[0, 0, 1, 1, 2, 3, 2, 3, 3, 2, 3]

 

 

'Tech > Coding' 카테고리의 다른 글

가장 긴 바이토닉 부분 수열  (0) 2024.03.02
1932번 정수 삼각형  (0) 2024.02.28
25494번 단순한 문제 (Small)  (0) 2024.02.27
Embedding a Python Playground  (0) 2024.02.26
# 20920번 영단어 암기는 괴로워  (0) 2024.02.26