[Baekjoon] 1463. 1로 만들기

less than 1 minute read

1로 만들기

문제 설명


문제

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

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

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

입력

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

출력

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

예제 입력 1

2

예제 출력 1

1

예제 입력 2

10

예제 출력 2

3

힌트

10의 경우에 10 -> 9 -> 3 -> 1 로 3번 만에 만들 수 있다.


문제 풀이


# 다이나믹 프로그래밍


이 문제에서는 상위 해답을 하위 해답을 이용하여 어떻게 구했을까요?

dp 배열의 인덱스를 무엇으로 설정했을까요?


cnts = [0,0]
for n in range(2,int(input())+1):
    cnts.append(cnts[n-1]+1)
    if n%3 == 0: cnts[-1] = min(cnts[-1],cnts[n//3]+1)
    if n%2 == 0: cnts[-1] = min(cnts[-1],cnts[n//2]+1)
print(cnts[-1])

동적 계획법은 아래에서 위로 올라가며 상위 해답을 미리 구해놓은 하위 해답들을 이용하여 구하는 것이죠.

for문에서 2부터 우리가 원하는 n까지 올라갑니다.


cnts 리스트는 여기서 사용할 dp 배열로, 각 원소의 인덱스는 해당 숫자를 뜻하고 값은 그 숫자까지 가는데 필요한 최소 연산의 수를 뜻합니다.

Leave a comment