ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo RhythmπŸ•ΊπŸ’ƒ] BOJ 17626. Four Squares
    Algo RhythmπŸ•ΊπŸ’ƒ/BOJ 2020. 8. 24. 15:06

    πŸ“š 문제 μ„€λͺ…

    λΌκ·Έλž‘μ£ΌλŠ” 1770년에 λͺ¨λ“  μžμ—°μˆ˜λŠ” λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€κ³  증λͺ…ν•˜μ˜€λ‹€. μ–΄λ–€ μžμ—°μˆ˜λŠ” 볡수의 λ°©λ²•μœΌλ‘œ ν‘œν˜„λœλ‹€. 예λ₯Ό λ“€λ©΄, 26은 52κ³Ό 12의 합이닀; λ˜ν•œ 4^2 + 3^2 + 1^2으둜 ν‘œν˜„ν•  μˆ˜λ„ μžˆλ‹€. μ—­μ‚¬μ μœΌλ‘œ μ•”μ‚°μ˜ λͺ…μˆ˜λ“€μ—κ²Œ κ³΅ν†΅μ μœΌλ‘œ μ£Όμ–΄μ§€λŠ” λ¬Έμ œκ°€ λ°”λ‘œ μžμ—°μˆ˜λ₯Ό λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λΌλŠ” κ²ƒμ΄μ—ˆλ‹€. 1900λ…„λŒ€ μ΄ˆλ°˜μ— ν•œ μ•”μ‚°κ°€κ°€ 15663 = 125^2 + 6^2 + 1^2 + 1^2λΌλŠ” ν•΄λ₯Ό κ΅¬ν•˜λŠ”λ° 8μ΄ˆκ°€ κ±Έλ Έλ‹€λŠ” 보고가 μžˆλ‹€. μ’€ 더 μ–΄λ €μš΄ λ¬Έμ œμ— λŒ€ν•΄μ„œλŠ” 56μ΄ˆκ°€ κ±Έλ Έλ‹€: 11339 = 105^2 + 15^2 + 8^2 + 5^2.

    μžμ—°μˆ˜ n이 μ£Όμ–΄μ§ˆ λ•Œ, n을 μ΅œμ†Œ 개수의 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

     

    μž…λ ₯
    μž…λ ₯은 ν‘œμ€€μž…λ ₯을 μ‚¬μš©ν•œλ‹€. μž…λ ₯은 μžμ—°μˆ˜ n을 ν¬ν•¨ν•˜λŠ” ν•œ μ€„λ‘œ κ΅¬μ„±λœλ‹€. μ—¬κΈ°μ„œ, 1 ≤ n ≤ 50,000이닀.
    좜λ ₯
    좜λ ₯은 ν‘œμ€€μΆœλ ₯을 μ‚¬μš©ν•œλ‹€. 합이 nκ³Ό κ°™κ²Œ λ˜λŠ” μ œκ³±μˆ˜λ“€μ˜ μ΅œμ†Œ 개수λ₯Ό ν•œ 쀄에 좜λ ₯ν•œλ‹€.

     

    🎯 μ–΄λ–»κ²Œ ν’€μ—ˆλ‚˜

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class BOJ_17626 {
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int n = Integer.parseInt(br.readLine());
    		
    		int[] dp = new int[n + 1];
    		dp[0] = 0;
    		dp[1] = 1;
    		
    		for(int i = 2; i <= n; i++) {
    			int min = Integer.MAX_VALUE;
    			
    			for(int j = 1; j * j <= i; j++)  {
    				min = Math.min(min, dp[i - j * j]);
    			}
    			
    			dp[i] = min + 1;
    		}
    		
    		System.out.println(dp[n]);
    	}
    }

     

    🧐 μ™œ μ €λ ‡κ²Œ ν’€μ—ˆλ‚˜

    Bottom-up λ°©μ‹μ˜ Dynamic Programming을 μ΄μš©ν–ˆλ‹€.

    DP λƒ„μƒˆκ°€ λ‚¬μ§€λ§Œ 식이 λ– μ˜€λ₯΄μ§€ μ•Šμ•„ 일단 λ‹€μŒκ³Ό 같이 λ‚˜μ—΄ν–ˆλ‹€.

     

     

    였래 κ΄€μ°°ν•œ κ²°κ³Ό 졜적의 ν•΄λ₯Ό κ΅¬ν•˜λŠ” 식을 λ°œκ²¬ν–ˆκ³  그것은 λ‹€μŒκ³Ό κ°™λ‹€.

     

    dp[i] = min(dp[i - j * j]) + 1

     

    μ‹λ§Œ 보면 μ΄ν•΄ν•˜κΈ° μ–΄λ ΅μ§€λ§Œ μ˜ˆμ œμ™€ ν•¨κ»˜ 보면 μ΄ν•΄ν•˜κΈ° 쉽닀.

    N이 4인 경우 4λ₯Ό μžμ—°μˆ˜μ˜ μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλŠ” μžμ—°μˆ˜λŠ”sqrt(4) μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€. 즉, 2 μ΄ν•˜μ˜ μžμ—°μˆ˜μ˜ μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ 4λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

    4λŠ” 1의 제곱수λ₯Ό μ‚¬μš©ν•΄μ„œ ν‘œν˜„ν•  경우 3을 λ§Œλ“€ λ•Œ 쓰인 1^2 + 1^2 + 1^2μ—μ„œ 1^2만 λ”ν•˜λ©΄ 되기 λ•Œλ¬Έμ— 3 + 1 = 4개의 μžμ—°μˆ˜κ°€ 쓰인닀.

    λ°˜λ©΄μ— 2의 제곱수λ₯Ό μ‚¬μš©ν•΄μ„œ ν‘œν˜„ν•  경우 2의 제곱수만 μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— 1개의 μžμ—°μˆ˜κ°€ 쓰인닀.

    λ‘˜ 쀑 2의 제곱수λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ 더 적은 수의 μžμ—°μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 2의 제곱수λ₯Ό μ‚¬μš©ν•˜λŠ” 경우λ₯Ό μ„ νƒν•œλ‹€.

     

     

    πŸ“– 무엇을 λ°°μ› λ‚˜

    DP μ°Έ 쉽지 μ•Šλ‹€ γ… γ… 

    λŒ“κΈ€

Designed by Tistory.