ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1699 - 제곱수의 합
    Baekjoon 2022. 4. 19. 18:02

    문제

    어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 3이다.

    주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오.

    package backjoon;
    
    import java.io.*;
    
    public class Sum_of_power {
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            int[] d = new int[100001];
            int min_value;
            d[1] = 1;
            for (int i = 2;i <= N;i++){
                min_value = Integer.MAX_VALUE;
                for (int j = 1;i - (j * j) >= 0;j++) { // N >= Ln^2
                    min_value = Math.min(min_value, d[i - (j * j)]);
                }
                d[i] = min_value + 1;
            }
            System.out.println(d[N]);
        }
    }

          ### 문제 풀이 이 문제에서 N의 범위는 1 <= N <= 100,000이다. 각 N에대한 답이 들어가 있는 d[N] int 배열을 선언해준다.

     

    d[N]의 값은, N을 제곱수들의 합을 표현 할 때에 그 항들의 최소 개수를 의미한다. 이에대해 점화식을 구해보았다.

     

    먼저 N을 제곱수들의 합으로 나타내야 하므로 N = ?^2 + ?^2 + ... + ?^2 이고, 마지막 항을 Ln(Last number)라고 하면, N = ?^2+ ?^2 + ... + Ln^2 와 같이 나타낼 수 있다.

     

    점화식을 세우기 위해 마지막 항을 빼고 이전 N으로 넘어간후에 Ln을 추가해주었다고 생각하면, d[N] = d[N - Ln^2] + 1 이라는 점화식을 세울 수 있게 된다. 이 식에서 N >= Ln^2인 Ln 중 d[N - Ln^2]의 최솟값을 구하게 되면 최소 개수를 구할 수 있게 된다.

     

    1을 더해주는 이유는, 마지막 항에 Ln을 더해주면서 한 개의 항이 더 추가되기 때문이다. 따라서 해당 점화식을 이용해 코드를 구현하면 아래와 같이 구현 할 수 있다.

     

    점화식으로 답을 구할 때, d 배열의 0번째 인덱스를 사용하지 않으므로 문제에서 주어지는 N 범위보다 1이 더 큰 사이즈로 배열을 선언했다. 추가적으로 N > Ln^2가 아닌 N >= Ln^2인 이유는, N이 제곱수일 때(ex : 4 = 2^2) 항 1개로 N을 만들 수 있으므로 d[4 - 2^2] + 1과 같이 항상 d[0]을 가져와 0 + 1의 값을 갖도록 만들기 위해서이다.

    'Baekjoon' 카테고리의 다른 글

    7576 - 토마토  (0) 2022.04.19
    2225 - 합분해  (0) 2022.04.19
    11727 - 2 x n 타일링2  (0) 2022.04.19
    10871 X보다 작은 수  (0) 2018.11.17
    1546 평균  (0) 2018.11.15
Designed by Tistory.