πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.1699 제곱수의 ν•© 문제 풀이 - java

πŸ“– 문제

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

μ–΄λ–€ μžμ—°μˆ˜ N은 그보닀 μž‘κ±°λ‚˜ 같은 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 11=3^2+1^2+1^2(3개 ν•­)이닀.

이런 ν‘œν˜„λ°©λ²•μ€ μ—¬λŸ¬ 가지가 될 수 μžˆλŠ”λ°, 11의 경우 11=2^2+2^2+1^2+1^2+1^2(5개 ν•­)도 κ°€λŠ₯ν•˜λ‹€. 이 경우,

μˆ˜ν•™μž μˆŒν¬λΌν…ŒμŠ€λŠ” β€œ11은 3개 ν•­μ˜ 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.”라고 λ§ν•œλ‹€. λ˜ν•œ 11은 그보닀 적은 ν•­μ˜

제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μ—†μœΌλ―€λ‘œ, 11을 κ·Έ ν•©μœΌλ‘œμ¨ ν‘œν˜„ν•  수 μžˆλŠ” 제곱수 ν•­μ˜ μ΅œμ†Œ κ°œμˆ˜λŠ” 3이닀.

주어진 μžμ—°μˆ˜ N을 μ΄λ ‡κ²Œ μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ ν‘œν˜„ν•  λ•Œμ— κ·Έ ν•­μ˜ μ΅œμ†Œκ°œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N이 주어진닀. (1 ≀ N ≀ 100,000)

좜λ ₯

주어진 μžμ—°μˆ˜λ₯Ό 제곱수의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό λ•Œμ— κ·Έ 제곱수 ν•­μ˜ μ΅œμ†Œ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

πŸ” 접근법

BOJ Q.11722 제곱수의 ν•© λ¬Έμ œμž…λ‹ˆλ‹€.

λ™μ ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ 풀이가 κ°€λŠ₯ ν•©λ‹ˆλ‹€.

μ£Όμ–΄μ§€λŠ” μžμ—°μˆ˜λ₯Ό 제곱수의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚  λ•Œ ν•΄λ‹Ή 제곱수 ν•­μ˜ μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

1 = 1^2

2 = 1^2 + 1^2

3 = 1^2 + 1^2 + 1^2

4 = 2^2

일 λ•Œ

μžμ—°μˆ˜ 5에 λŒ€ν•œ 제곱수의 합은

2+3 λ˜λŠ” 1+4 둜 κ°€λŠ₯ν•©λ‹ˆλ‹€ .

5 = 1^2 + 1^2 + 1^2 + 1^2 + 1^2

or

5 = 2^2 + 1^2

둜 κ°€λŠ₯ν•œλ° μ—¬κΈ°μ„œ 1+4의 경우인 2^2 + 1^2 κ°€ ν•­μ˜ κ°œμˆ˜κ°€ μ μŠ΅λ‹ˆλ‹€.

즉 5에 λŒ€ν•œ 제곱수의 합을 λ§Œλ“€ 수 μžˆλŠ” κ²½μš°μ—μ„œ μ΅œμ†Œ 개수의 ν•­μœΌλ‘œλ§Œ κ΅¬μ„±λ˜λ„λ‘ ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ d[i] 배열은 각 μžμ—°μˆ˜ i에 λŒ€ν•œ 제곱수의 ν•© μ΅œμ†Œ 개수의 ν•­μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ―€λ‘œ 이 값듀을 μ‘°ν•©ν•˜λ©΄

주어진 μžμ—°μˆ˜ NκΉŒμ§€μ˜ 제곱수의 ν•©μ˜ μ΅œμ†Œ 개수λ₯Ό ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

d[i] = min(d[i],d[i-(제곱수의 ν•©)] + 1)

πŸ’» μ½”λ“œ

package problem.dynamic;

import java.io.*;

public class Main_1699 {
    static int n;
    static int[] d;

    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        input();
        solve();
        bw.write(Integer.toString(d[n]));
        bw.flush();
        bw.close();
    }

    public static void solve() {
        d[1] = 1;
        for(int i=2; i<=n; i++){
            d[i] = i;
            for(int j=1; j*j<=i; j++){
                d[i] = Math.min(d[i],d[i-(j*j)]+1);
            }
        }
    }

    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        d = new int[n + 1];
        br.close();
    }
}


Written on February 25, 2021