코딩테스트/DP
[실버3] 백준 17626 Four Squares JAVA풀이
정재익
2025. 7. 25. 00:24
package org.practice.dp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 실버 3 Four Squares
public class b17626 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[n + 1];
dp[0] = 0;
//dp[1] = 1; // 1 -> 1제곱
//dp[2] = 2; // 1 + 1 -> dp[1] + dp[1]
//dp[3] = 3; // 1 + 1 + 1 -> dp[2] + dp[1]
//dp[4] = 1; // 4 -> dp[3] - 2
//dp[5] = 2; // 4 + 1 -> dp[4] + dp[1]
//dp[6] = 3; // 4 + 1 + 1 -> dp[4] + dp[2]
//dp[7] = 4; // 4 + 1 + 1 + 1 -> dp[4] + dp[3]
//dp[8] = 2; // 4 + 4 -> dp[4] + dp[4]
//dp[9] = 1; // 9 -> dp[8] - 1
//dp[10] = 2; // 9 + 1 -> dp[9] + dp[1]
// 우선 누군가의 제곱수는 무조건 1이다 예를들어 1, 4, 9 의 경우
// 최소 개수의 제곱수의 합을 위해서 해당 dp 이전의 최대 제곱수를 빼면된다고 하기엔 그것이 전체 최적 해를 보장 못한다.
// 그래서 자기자신보다 작은 제곱수들을 탐색하고 자기자신을 해당 제곱수들로 뺀 값 중 최소를 찾는다.
for (int i = 1; i <= n; i++) {
dp[i] = 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]);
}
}