자연수 N은 그보다 작거나 같은 수들의 합으로 표현이 가능하다. 그중에서 최소 갯수를 사용해 표시하는 경우의 수를 구하시오.
네. 당연히 반복문 사용하면 풀릴줄알았습니다.
import java.awt.*;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
int count = 0;
while (N > 0) { // 10만 이하
// N보다 작거나 같은 제곱수 찾기
int sqrtN = (int) Math.sqrt(N);
//System.out.println(sqrtN);
int powN = (int) Math.pow(sqrtN, 2);
N -= powN;
count++;
}
System.out.println(count);
}
}
dp[1] = 1 (1^2)
dp[4] = 1 (2^2)
dp[9] = 1 (3^2)
dp[17] = dp[16] + 1 or dp[13] + 1 or dp[8] + 1
or dp[1] + 1
1. dp[17] = 2 (1^1 + dp[16])
2. dp[17] = 3 (2^2 + dp[13])
3. dp[17] = 4 (3^3 + dp[8])
4. dp[17] = 2 (4^4 + 1)
이중에서 최소 경우의수는 2입니다.
따라서 이걸 조건식으로 놔주면됩니다.
for (int i = 1; i <= N; i++){
dp[i] = i;
for (int j = 1; j * j <= N; j++){
if (dp[i] > dp[i - j * j] + 1){
// 더 작은 경우가 있다면 최신화한다.
dp[i] = dp[i - j * j] + 1;
}
}
}
import java.awt.*;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
int count = 0;
// 또 dp야
int[] dp = new int[N + 1];
for (int i = 1; i <= N; i++) {
dp[i] = i;
for (int j = 1; j * j <= i; j++) {
if (dp[i] > dp[i - j * j] + 1) {
dp[i] = dp[i - j * j] + 1;
}
}
}
// dp[1] = 1;
// dp[4] = 1;
// dp[9] = 1; -> 제곱수들은 모두 1개이다.
// dp[8] = dp[7] + 1 or dp[4] + 1 중에 하나일 것이다.
// N보다 작은 제곱수들로 빼준것 + 1 중에 더 작은게 있으면 그걸로 대체한다.
System.out.println(dp[N]);
}
}