프로그래밍_백준/Python

Python) 백준 1463번: dp, 1로 만들기

공부하려구요 2024. 9. 30. 11:21
728x90
반응형

https://www.acmicpc.net/problem/1463

숫자 N이 주어졌을 때, 1로 만드는 최소 연산 횟수를 구하는 문제이다.
1. 3으로 나누어떨어지면, 3으로 나누는 연산
2. 2로 나누어떨어지면, 2로 나누는 연산
3. 1을 빼는 연산


이 문제는 Dynamic Programming(동적 계획법)을 사용하여 해결할 수 있다.

 

import sys

input = sys.stdin.readline

def make_one(n):
    dp = [0] * (n + 1)
    
    for i in range(2, n + 1):        
        if i % 2 == 0:
            a = dp[i // 2] + 1
        else:
            a = float('inf')
            
        if i % 3 == 0:
            a = min(a, dp[i // 3] + 1)
        
        b = dp[i - 1] + 1

        dp[i] = min(a, b)
    
    return dp[n]

N = int(input().strip())
print(make_one(N))

 

 

  • 초기값 설정
    • dp[1]은 0으로 설정. 왜냐하면, 숫자 1은 연산이 필요 없기 때문이다.
    • dp[2]부터 값을 계산한다.
  • 나누기 연산과 1 빼기 연산
    • 2로 나누어 떨어지는 경우: dp[i // 2] + 1을 계산합니다. 이때 dp[i // 2]는 이미 계산된 값이며, +1은 연산 횟수를 추가하는 것이다.
    • 3으로 나누어 떨어지는 경우: 동일하게 dp[i // 3] + 1을 계산한다.
    • 1을 빼는 경우: dp[i - 1] + 1을 계산한다.
  • 최소값 계산
    • 위 세 가지 방법 중 가능한 방법들 중 최소값을 dp[i]에 저장한다.
  • 무한대 값 처리
    • 숫자가 2나 3으로 나누어지지 않을 경우를 처리하기 위해 float('inf') 값을 사용하여 해당 조건이 성립하지 않음을 표시다.

 

728x90
반응형