[백준 17626 : JAVA] Four Squares
1. 문제
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은
2. 입력
입력은 표준입력을 사용한다. 입력은 자연수
3. 출력
출력은 표준출력을 사용한다. 합이
4. 풀이
유명한 DP 입문용 문제입니다.
1부터 차례대로 나열해보겠습니다.
1 =
2 =
3 =
4 =
5 =
6 =
7 =
8 =
점화식은 다음과 같습니다.
f(n) = f(n - m*m) + 1
처음에 제가 실수한 부분은 위 점화식에서 m*m이 n보다 작거나 같은 가장 큰 수로 잡은 것이었습니다.
위와 같이 하게되면 다음의 반례가 존재합니다.
f(12) = f(12 - 3*3) + 1
즉, 12 =
따라서, min 함수로 가장 작은 값을 구해줘야 합니다. (코드로 확인해보세요. 🙂 )
5. 코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); private static int N; private static int[] dp; public static void main(String[] args) throws IOException { N = Integer.parseInt(in.readLine()); dp = new int[N + 1]; bottomUp(); System.out.println(dp[N]); } private static void bottomUp() { dp[1] = 1; for (int i = 2; i <= N; i++) { dp[i] = 0x7fffffff; for (int j = 1; j * j <= i; j++) { int idx = i - j * j; dp[i] = Math.min(dp[i], dp[idx] + 1); } } } }
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 12865 : JAVA] 평범한 배낭 (0) | 2021.09.08 |
---|---|
[백준 15486 : JAVA] 퇴사 2 (0) | 2021.09.06 |
[백준 12100 : JAVA] 2048 (Easy) (0) | 2021.08.16 |
[백준 10972 : JAVA] 다음 순열 (0) | 2021.08.09 |
[백준 1931 : JAVA] 회의실 배정 / 그리디 (0) | 2021.08.03 |
댓글
이 글 공유하기
다른 글
-
[백준 12865 : JAVA] 평범한 배낭
[백준 12865 : JAVA] 평범한 배낭
2021.09.08 -
[백준 15486 : JAVA] 퇴사 2
[백준 15486 : JAVA] 퇴사 2
2021.09.06 -
[백준 12100 : JAVA] 2048 (Easy)
[백준 12100 : JAVA] 2048 (Easy)
2021.08.16 -
[백준 10972 : JAVA] 다음 순열
[백준 10972 : JAVA] 다음 순열
2021.08.09
댓글을 사용할 수 없습니다.