17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net

의식의 흐름
dp로 1~n까지 만드는데 필요한 최소 개수 구해보자.
+ 종이에 1~12까지 구할 수 있는 최소 경우의 수를 써보는데 12 = 3^2+1^2+1^2+1^2(4개) / 2^2+2^2+2^2(3개)로 나뉘는 것을 확인하고 무조건 최대 제곱수를 쓰면 틀리겠구나 생각함
풀이 과정
1. 자연수(n)을 입력받는다.
2. 1~n까지 만드는데 필요한 제곱수의 최소 개수를 구하여 배열(dp)에 저장한다.
dp[i] = i를 만드는데 필요한 제곱수의 최소 개수
이때, 최대 제곱수를 이용한다고 최소 개수가 되는 것이 아니므로 모든 경우를 구해서 최소 개수를 찾아본다.
for(int j=1;j*j<=i;j++){
minCnt = Math.min(minCnt, dp[i-j*j]+1);
}
3. dp[n]을 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static int n;
public static int[] dp;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
dp = new int[n+1];
dp[1] = 1;
for(int i=2;i<=n;i++){
int minCnt = Integer.MAX_VALUE;
for(int j=1;j*j<=i;j++){
minCnt = Math.min(minCnt, dp[i-j*j]+1);
}
dp[i] = minCnt;
}
bw.write(Integer.toString(dp[n]));
bw.flush();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[골드IV] 백준 q6137 - 문자열 생성 (0) | 2024.01.21 |
---|---|
[JAVA] 백준 q15787 - 기차가 어둠을 헤치고 은하수를 (0) | 2023.12.13 |
[JAVA] 백준 q21608 - 상어 초등학교 (2) | 2023.11.22 |
[JAVA] 백준 q16926 - 배열 돌리기 1 (0) | 2023.11.21 |
[JAVA] 백준 q22945 - 팀 빌딩 (2) | 2023.11.20 |
17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net

의식의 흐름
dp로 1~n까지 만드는데 필요한 최소 개수 구해보자.
+ 종이에 1~12까지 구할 수 있는 최소 경우의 수를 써보는데 12 = 3^2+1^2+1^2+1^2(4개) / 2^2+2^2+2^2(3개)로 나뉘는 것을 확인하고 무조건 최대 제곱수를 쓰면 틀리겠구나 생각함
풀이 과정
1. 자연수(n)을 입력받는다.
2. 1~n까지 만드는데 필요한 제곱수의 최소 개수를 구하여 배열(dp)에 저장한다.
dp[i] = i를 만드는데 필요한 제곱수의 최소 개수
이때, 최대 제곱수를 이용한다고 최소 개수가 되는 것이 아니므로 모든 경우를 구해서 최소 개수를 찾아본다.
for(int j=1;j*j<=i;j++){
minCnt = Math.min(minCnt, dp[i-j*j]+1);
}
3. dp[n]을 출력한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static int n;
public static int[] dp;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
dp = new int[n+1];
dp[1] = 1;
for(int i=2;i<=n;i++){
int minCnt = Integer.MAX_VALUE;
for(int j=1;j*j<=i;j++){
minCnt = Math.min(minCnt, dp[i-j*j]+1);
}
dp[i] = minCnt;
}
bw.write(Integer.toString(dp[n]));
bw.flush();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[골드IV] 백준 q6137 - 문자열 생성 (0) | 2024.01.21 |
---|---|
[JAVA] 백준 q15787 - 기차가 어둠을 헤치고 은하수를 (0) | 2023.12.13 |
[JAVA] 백준 q21608 - 상어 초등학교 (2) | 2023.11.22 |
[JAVA] 백준 q16926 - 배열 돌리기 1 (0) | 2023.11.21 |
[JAVA] 백준 q22945 - 팀 빌딩 (2) | 2023.11.20 |