728x90
https://www.acmicpc.net/problem/1463
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 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
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 11047 동전 0 (파이썬 풀이) (0) | 2022.02.06 |
---|---|
[알고리즘] 백준 2579 계단 오르기 (자세한 파이썬 풀이) (0) | 2022.02.05 |
[알고리즘] 백준 9095 (파이썬 풀이) (0) | 2022.02.03 |
[알고리즘] 백준 11723 (파이썬 풀이) (0) | 2022.02.02 |
[알고리즘] 백준 1003 피보나치 함수 (파이썬 풀이) (0) | 2022.01.30 |
댓글