ν•΄λ²„λ‹ˆ 2023. 11. 30. 12:52
λ°˜μ‘ν˜•

 

문제

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

 

1699번: 제곱수의 ν•©

μ–΄λ–€ μžμ—°μˆ˜ N은 그보닀 μž‘κ±°λ‚˜ 같은 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 11=32+12+12(3개 ν•­)이닀. 이런 ν‘œν˜„λ°©λ²•μ€ μ—¬λŸ¬ 가지가 될 수 μžˆλŠ”λ°, 11의 경우 11=22+22+12+12+12(5개 ν•­)도 κ°€λŠ₯ν•˜λ‹€

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

 

 

풀이

μ²˜μŒμ—λŠ” 큰 μ œκ³±μ„ λΉΌμ£Όκ³  개수λ₯Ό κ΅¬ν•˜λŠ” μ‹μœΌλ‘œ μ§°λ‹€.

(μ΄λ ‡κ²Œ ν•˜λ©΄ 될 쀄 ,,, ) 

 

예λ₯Ό λ“€μ–΄ 41 = 16 + 25둜 2 κ°€ λ‚˜μ˜¬ μˆ˜λ„ 있고, 36 + 4 + 1둜 3 이 λ‚˜μ˜¬ μˆ˜λ„ μžˆλ‹€.

 

ν•˜μ§€λ§Œ λ‚΄κ°€ μ§  건 큰 μ œκ³±μ„ λΉΌμ£Όκ³  개수λ₯Ό μ„ΈλŠ” μ‹μœΌλ‘œ μ§°κΈ° λ•Œλ¬Έμ— 36 + 4 + 1둜 3이 λ°˜ν™˜λ˜μ–΄ ν‹€λ¦° 둜직이 λ˜μ—ˆλ‹€. 

 

κ·Έλž˜μ„œ 배열을 ν•˜λ‚˜ μ„ μ–Έν•΄μ„œ μ—¬λŸ¬ 경우 쀑 κ°€μž₯ μž‘μ€ 값을 λ„£μ–΄μ„œ λ‹€μ‹œ 문제λ₯Ό ν’€μ—ˆλ‹€. 

 

 

μž…λ ₯κ°’ 10의 μ΅œμ†Ÿκ°’μ€ 2이닀.

arr[1] = 1

arr[2] = 2

arr[3] = 3

arr[4] = 2^2 = 1 

arr[5] = arr[4] + arr[1] = 1 + 1 = 2

arr[6] = arr[4] + arr[2] = 1 + 2 = 3

arr[7] = arr[4] + arr[3] = 1 + 3 = 4

arr[8] = arr[4] + arr[4] =  1 + 1 = 2 

arr[9] = 3^2 = 1 

arr[10] = arr[9] + arr[1] = 1 + 1 = 2  

              arr[6] + arr[4] = 3 + 1 = 4

 

μœ„μ²˜λŸΌ arr[10] 처럼 μ—¬λŸ¬κ°œμ˜ 값이 κ΅¬ν•΄μ§ˆ 경우 Math.min()을 톡해 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” λ‘œμ§μ„ λ§Œλ“€μ–΄μ€¬λ‹€.

 

 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    public static int[] arr = new int[100001];

    /**
     * μ΅œμ†Œ 개수 κ΅¬ν•˜κΈ°
     * 
     * @param x
     */
    public static void square(int x) {
        int num = (int) Math.sqrt(x);
        int min = 10001;
        // 제곱근이라면 1개 
        if (num * num == x) {
            arr[x] = 1;
        } else if (num >= 2) {
            for (int i = 2; i <= num; i++) {
                int number = x - i * i;
                if (arr[number] == 0) {
                    square(number);
                }
                if (arr[x - number] == 0) {
                    square(x - number);
                }
                min = Math.min((arr[number] + arr[x - number]), min);
            }
            arr[x] = min;
        }

    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int num = Integer.parseInt(br.readLine());

		// 1, 2, 3은 ν•œ 가지 경우의 μˆ˜λ°–μ— μ—†μœΌλ―€λ‘œ μ΄ˆκΈ°κ°’ μ„€μ • 
        arr[1] = 1;
        arr[2] = 2;
        arr[3] = 3;

        square(num);

        bw.write(String.valueOf(arr[num]));
        bw.flush();
        bw.close();
    }
}

 

 

 

 

 

 

 

 

 

 

μ •λ‹΅ 

 

 

 

 

 

 

λ°˜μ‘ν˜•