백준 : 동적 프로그래밍

백준 : 제곱수들의 합(1699) with 자바

유민기 2023. 9. 24. 16:23

https://www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

 

제목그데로 숫자 N이 주어졌을 때 N의 제곱수들의 합인 최솟값을 구하는 문제이다.

위에 적은 제곱수들이 주어진 N에 대한 최솟값의 제곱수들로 이루어진 수이다.

 

예제를 분석해보았다.

public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int N = sc.nextInt();
       int[] dp = new int[N + 1]; // dp 배열 크기를 N + 1로 설정
       dp[0] = 0;

       for (int i = 1; i <= N; i++) {
              dp[i] = 100001;
              for (int j = 1; j * j <= i; j++) { // j*j가 i 이하인 범위까지만 고려
                    dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
              }
      }
      System.out.println(dp[N]); // dp[N] 출력
}

코드가 간단하니 나눠서 설명하지 않고 한번에 설명하겠다.

먼저 스캐너 객체를 생성한뒤, N에 입력값을 입력받는다.

그리고 빈배열 dp를 생성하고 크기를 N + 1로 지정한다.

dp[0] = 0 이라고 고정을 한뒤, dp[i]의 값을 반복문을 통해서 구하려 한다.

임시배열 i를 생성하고 반복문을 한번 돌린 뒤 dp[i] = 100001의 범위를 지정한다. 문제 조건에서 자연수의 범위가  (1 ≤ N ≤ 100,000)라고 되어있으므로 이렇게 지정하였다.

임시배열 j를생성하고 반복문을 한번 더돌려서  dp[i], dp[i - j^2 + 1] 의 최솟값을 구해서 dp[i]dㅔ 저장할 것이다. 그러면 제곱수의 최솟값이 dp[]에 저장 될 것이다.

저장된 dp[N]의 최솟값을 을 출력한다.