[알고리즘 ] 백준 1463 (파이썬 풀이)

    728x90

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

     

    1463번: 1로 만들기

    첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

    www.acmicpc.net

    문제

    정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

    1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
    2. X가 2로 나누어 떨어지면, 2로 나눈다.
    3. 1을 뺀다.

    정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

    입력

    첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

    출력

    첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

     

    해결코드

    import sys
    
    input = sys.stdin.readline
    num = int(input())
    dp = [0 for i in range(num+2)]
    
    dp[1] = 0
    dp[2] = 1
    
    for i in range(3, num+1):
        dp[i] = 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[num])

    문제풀이

    이 문제는 동적 계획법을 이용하여 푸는 문제이다.

    dp[n]은 num이 1로되는 최소 값을 넣어주면 된다

    num이 3으로 나누어지면 , dp[num//3]+1을 하고

    num이 2로 나누어지면, dp[num//2]+1을 하면 된다.

    둘다 아니면 dp[num-1]+1 을 한다.

    위 3가지 경우를 다해서 최소 값을 dp[num]에 넣어주면 된다.

    728x90

    댓글