PS/Baekjoon Online Judge

[백준 01463] 1로 만들기 [C/C++]

kimyoungrok 2024. 7. 15. 13:27
728x90

문제

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

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

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

입력

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

출력

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


풀이

N을 1로 만들기 위한 연산을 최소화하는 문제다.

dp[i] : i를 만들기 위한 최소 연산 횟수

 

문제의 힌트를 보면 알 수 있듯 N을 1로 만드는 방법에서는 단순한 점화식이 나오지 않는다.

1을 N으로 만드는 방법을 생각해보자.

dp[i] = dp[i - 1] + 1는 기본값으로 가진다.

dp[i]는 dp[i / 2] 또는 dp[i / 3]의 배수가 될 수 있다.

이 경우 순서대로 적용하면 된다.


소스코드

보기


출처

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

 

728x90