-
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