영호

[백준] 제곱수의 합 1699(Java) 본문

Algorithm/DP

[백준] 제곱수의 합 1699(Java)

0h0 2022. 10. 8. 16:59

문제 링크

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

나의 풀이

잘못된 접근

잘못 세운 점화식

$$ dp[i] = dp[i - (가장 큰 제곱근 ^ 2)] + 1$$ 

 

단순하게 가장 큰 제곱근의 제곱을 빼서 dp 테이블을 갱신하는 것이 최솟값이라고 생각을 했습니다.

 

예를 들어 i = 26의 경우

가장 큰 제곱근인 5의 제곱 25를 26에서 뺀 뒤 나온 1. 즉, dp[26-25] + 1 이 무조건 최솟값이라고 생각했습니다.

$$ 26 = 1^2 + 5^2$$

올바른 접근

점화식의 경우 위에서 세운 점화식이 아예 틀린 것은 아니지만 가장 큰 제곱근만 생각하는 것이 아닌 1 ~ 가장 큰 제곱근의 경우를 모두 생각해야 합니다. 12를 시도해보면 좋을 거 같습니다.

 

$$ dp[i] = min(dp[i - 1^2 부터  (가장 큰 제곱근^2)] + 1, dp[i])$$

위 점화식을 바탕으로 i=1부터 n까지 갱신을 하면 됩니다.

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    static int[] dp;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        dp = new int[n + 1];

        for (int i = 1; i < n + 1; i++) {
            dp[i] = i;
        }

        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j * j <= i; j++) {
                dp[i] = Math.min(dp[i], dp[i - (j * j)] + 1);
            }
        }
        System.out.println(dp[n]);

    }
}

Git

https://github.com/youngh0/java-algorithm/blob/master/algorithm/src/main/java/dp/boj_1699/Main.java

'Algorithm > DP' 카테고리의 다른 글

[백준] 퇴사 14501 (Java)  (0) 2022.10.13
[백준] 스티커 9465 (python)  (0) 2022.09.18
Comments