안녕하세요. 오늘은 백준의 1463. 1로 만들기 문제를 풀어보겠습니다.
https://www.acmicpc.net/problem/1463
이전에 풀었던 dp문제들과 마찬가지로, 2부터 쭉쭉 나열해본 결과 규칙을 찾을 수 있었습니다.
X | 정답 | 정답 도출 방법 |
---|---|---|
2 | 1 | 1*2 = 2 |
3 | 1 | 1*3 = 3 |
4 | 2 | 122 = 4 |
5 | 3 | (5-1) -> 4, (X = 4일때 결과) + 1 |
6 | 1 | 123 = 6 |
7 | 2 | (7-1) -> 6, (X = 6일때 결과) + 1 |
8 | 3 | 122*2 = 8 |
9 | 2 | 133 = 9 |
10 | 3 | (10-1) -> 9, (10-2) -> 8 |
11 | 4 | (11-1) -> 10, (11-2) -> 9 |
12 | 2 | 122*3 = 12 |
13 | 3 | (13-1) -> 12, (13-2) -> 11 |
14 | 3 | (14-1) -> 13, (14-2) -> 12, 14/2 -> 7 |
15 | 4 | 15/3 -> 5, (15-1) -> 14, (15-2) -> 13 |
위의 표처럼 구하려는 x가 2로 나뉘어지는지, 3으로 나뉘어지는지, 둘 다 나뉘어지지 않는다면 1을 빼주고 결과값을 확인하면 됩니다.
이를 점화식으로 나타낸다면 아래와 같습니다.
one = (만약 3으로 나뉘어진다면) dp[x/3]+1
two = (만약 2로 나뉘어진다면) dp[x/2]+1
three = dp[x-1] + 1
result = (one, two, three) 중 최소값
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br.readLine());
int[] dp = new int[x + 1];
dp[1] = 0;
for (int i = 2; i <= x; i++) {
int tmp = i - 1;
if (i % 2 == 0)
tmp = Math.min(tmp, dp[i / 2] + 1);
if (i % 3 == 0)
tmp = Math.min(tmp, dp[i / 3] + 1);
tmp = Math.min(tmp, dp[i - 1] + 1);
dp[i] = tmp;
}
System.out.println(dp[x]);
}
}