
문제
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 12으로 표현할 수도 있다. 역사적으로 암산의 명수들에게 공통적으로 주어지는 문제가 바로 자연수를 넷 혹은 그 이하의 제곱수 합으로 나타내라는 것이었다. 1900년대 초반에 한 암산가가 15663 = 1252 + 62 + 12 + 12라는 해를 구하는데 8초가 걸렸다는 보고가 있다. 좀 더 어려운 문제에 대해서는 56초가 걸렸다: 11339 = 1052 + 152 + 82 + 52.
자연수 n이 주어질 때, n을 최소 개수의 제곱수 합으로 표현하는 컴퓨터 프로그램을 작성하시오.
입력
입력은 표준입력을 사용한다. 입력은 자연수 n을 포함하는 한 줄로 구성된다. 여기서, 1 ≤ n ≤ 50,000이다.
출력
출력은 표준출력을 사용한다. 합이 n과 같게 되는 제곱수들의 최소 개수를 한 줄에 출력한다.
예제 입력 1 복사
25
예제 출력 1 복사
1
예제 입력 2 복사
26
예제 출력 2 복사
2
예제 입력 3 복사
11339
예제 출력 3 복사
3
예제 입력 4 복사
34567
문제 풀이
해당 문제는 동적 프로그래밍을 이용하면 간단하게 풀 수 있다. 넷 혹은 그 이하의 제곱수의 합으로 숫자를 나타내기 위해서는 (해당 숫자 - 자신보다 작거나 같은 제곱수) 중 가장 작은 횟수를 사용하는 합에 제곱수를 더하면 만들 수 있다.
위의 방법으로 6을 제곱수의 합으로 나타내 보자.
1. (자신보다 작거나 같은 제곱수)의 경우를 구한다
자신보다 작거나 같은 제곱수는 1, 4이다.
2. (값 - 위에서 구한 값)의 수 중 가장 작은 것을 구한다.
dp[6 - 1] => 2^2 + 1^2 + 1^1 로 3
dp[6 - 4] => 1^2 + 1^2 로 2
두 경우 중 작은 경우는 dp[6-4]로 dp[2] = 2이다.
3. 위 경우를 가지고 dp[6]을 구한다.
dp[6] = dp[2] + 4 = 1^2 +1^2 + 2^2 = 3이다.
위와 같은 경우로 최소값을 구해나가면 원하는 값을 구할 수 있다.
정답 코드
import java.io.*;
import java.util.*;
public class Main {
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static int[] dp = new int[50001];
public static int[] dp2;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int num = Integer.parseInt(st.nextToken());
dp[1] = 1;
for(int i = 2; i <= num; i++) {
int min = Integer.MAX_VALUE;
for (int j = 1; j * j <= i; j++) {
int temp = i - j * j;
min = Math.min(min, dp[temp]);
}
dp[i] = min + 1;
}
System.out.println(dp[num]);
bw.flush();
bw.close();
}
}
'algorithm > problems' 카테고리의 다른 글
| [백준 / Java] 1865번 : 웜홀 (0) | 2023.07.27 |
|---|---|
| [백준 / Java] 1504번 : 특정한 최단 경로 (0) | 2023.07.24 |
| [프로그래머스 / Javascript] 당구 연습 (1) | 2023.06.16 |
| [프로그래머스 / Javascript] 전력망을 둘로 나누기 (0) | 2023.06.01 |
| [프로그래머스 / C++] 이모티콘 할인행사 (0) | 2023.05.19 |