1로 만들기

박고은·2023년 7월 14일
0

코딩테스트 연습

목록 보기
31/34

문제 ✨

1463번: 1로 만들기

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

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

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

X = int(input())
dp = [0]*(X+1)

for i in range(2, X+1):
    dp[i] = dp[i-1] + 1
    if not i%2: dp[i] = min(dp[i], dp[i//2]+1)
    if not i%3: dp[i] = min(dp[i], dp[i//3]+1)

print(dp[X])

인덱스 숫자에 사용된 연산의 최소 횟수을 저장한 배열 dp
1을 빼는 연산을 실행하게 되는 경우는 매번 가능, 하나 적은 숫자까지의 연산 횟수에 1번 추가
2나 3으로 나누어 떨어지는 경우에는 이전의 배수까지의 연산 횟수에 나누는 연산 1번 추가
-> 둘 중에 더 적은 값을 dp 배열에 저장

0개의 댓글