알고리즘

DP - 점화식을 찾자 (백준 1463번 1로 만들기)

효재감자 2023. 9. 2. 21:35

백준 1463번 1로 만들기 문제에서...

 

dp[n] 을 n을 1로 만드는 최소횟수라 생각하자.

DP 문제에서 가장 중요한 것은 점화식을 찾는 것이다.

 

(3으로 나눌 수 있다면) dp[n] = dp[n/3] + 1 이다.

(2로     나눌 수 있다면) dp[n] = dp[n/2] + 1 이다.

                  1을 뺀다면 dp[n] = dp[n-1] + 1 이다.

 

(어떤 작업을 한다면) dp[n] (현재 작업의 횟수는) = dp[작업하기 전의 횟수] + 1 (어떤 작업) 이다.

 

예시로, dp[12] = min(dp[4] + 1, dp[6] + 1, dp[11] + 1) 이며, 이는 12를 1로 만드는 최소 연산 횟수이다.

3가지 중에 가장 최소의 값을 찾아 갱신하는 것이다.

물론 dp[4] 또는 dp[6]을 참조하기 전에 3이나 2로 나눠질 수 있는지 먼저 계산한 후 나눠질 수 있다면 참조해야 한다.

 

초기값은 dp[0] = dp[1] = 0 이다.

 

정답 코드는 아래와 같다.

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] dp = new int[N + 1];
        dp[0] = dp[1] = 0;
        for (int i = 2; i <= N; i++) {
            dp[i] = dp[i - 1] + 1;
            if (i % 2 == 0) dp[i] = Math.min(dp[i], dp[i / 2] + 1);
            if (i % 3 == 0) dp[i] = Math.min(dp[i], dp[i / 3] + 1);
        }
        System.out.println(dp[N]);

 

아래 필기를 게시글로 옮긴 것이다.