[백준] 1463. 1로 만들기

주형(Jureamer)·2022년 11월 24일
0

1로 만들기

분류

  • 다이나믹 프로그래밍

문제 설명

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

X가 3으로 나누어 떨어지면, 3으로 나눈다.
X가 2로 나누어 떨어지면, 2로 나눈다.
1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.


입력

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


출력

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

예제 입력 & 출력

입력: 
2

출력: 
1

입력:
10

출력:
3

문제풀이

이 문제는 다이나믹 프로그래밍 문제다. 다이나믹 프로그래밍(DP)는 어떠한 조건에 부합할 때 사용할 수 있다.

  • 최적 부분 구조 (Optimal Substructure)
    큰 문제를 작은 문제로 나눌 수 있고, 작은 문제의 답을 모아 큰 문제를 해결할 수 있는 경우를 의미
  • 중복되는 부분 문제 (Overlapping Subproblem)
    동일한 작은 문제를 반복적으로 해결해야 하는 경우

해당 문제는 조건을 충족하여 탑다운방식으로 메모이제이션을 활용해서 풀 수 있다.

python 문제 풀이

X = int(input())

# 메모이제이션을 위해 X + 1길이만큼 배열을 생성한다.
d = [0] * (X + 1)

# 1은 이미 0의 값이 들어있기에 제외하고 2부터 시작한다.
for i in range(2, X + 1):
	# 이전 값에 1을 더한 값을 할당해둔다. (3가지 조건 중 1을 뺀다에 해당)
    d[i] = d[i-1] + 1
    
    # 2로 나눠지는 경우 3으로 나눈 값 + 1과 비교하여 최소값을 할당
    if i % 3 == 0:
        d[i] = min(d[i], d[int(i / 3)] + 1)
        
    # 2로 나눠지는 경우 2로 나눈 값 + 1과 비교하여 최소값을 할당
    if i % 2 == 0:
        d[i] = min(d[i], d[int(i / 2)] + 1)

print(d[X])

참고

profile
작게라도 꾸준히 성장하는게 목표입니다.

0개의 댓글