PS/백준

[BOJ] 백준 12852번 : 1로 만들기 2 (JAVA)

제이온 (Jayon) 2021. 1. 20.

문제

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

 

 

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

 

 

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

 

 

입력

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

 

 

출력

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

 

둘째 줄에는 N을 1로 만드는 방법에 포함되어 있는 수를 공백으로 구분해서 순서대로 출력한다. 정답이 여러 가지인 경우에는 아무거나 출력한다.

 

 

풀이

다이나믹 프로그래밍으로 풀 수 있는 문제였습니다.

 

문제에서 나온 3가지 식을 그대로 쓰시면 됩니다. N = 1일 때만 연산 횟수를 0으로 설정해 놓고, dp[i] = min(dp[i / 3], dp[i / 2], dp[i - 1])을 점화식으로 세우고 bottom-up 방식으로 다이나믹 프로그래밍 소스코드를 구현하면 끝입니다.

 

다만, 이 문제에서는 연산 과정도 출력하라고 하였으므로 저는 클래스를 하나 정의해서 멤버 변수로 연산 횟수와 연산 과정을 만들었습니다.

 

 

아래는 위 과정을 정리한 소스코드입니다.

 

 

소스코드

 

 

지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.

댓글

추천 글