백준 17626 - Four Squares

Updated:

Java

17626 번 - Four Squares

문제

자연수 n이 주어질 때, n을 최소 개수의 제곱수 합으로 표현하는 컴퓨터 프로그램을 작성하시오.
여기서, 1 ≤ n ≤ 50,000이다.

접근 방법

DP를 사용하여 해결한 문제였다.
각 인덱스가 수를 나타내고, 값이 해당하는 값까지 오는 연산 수를 담을 1차원 배열을 만든다.

연산이 가능한 수는 제곱수이므로, n보다 작은 제곱수들을 미리 다 구한다.

이제 1부터 시작하여, n까지 각 수를 탐색하는데, i와 각 제곱수들을 빼보고 이 값이 0보다 크다면, 현재 i - 제곱수에서 i로 연산 한번을 하여 올 수 있다는 뜻으므로, 연산 수의 최솟값을 갱신한다.

n의 수까지 도달하면, n까지 도달하는데 걸리는 최소 제곱수 합 연산 수를 구할 수 있다.

코드

import java.util.*;
import java.io.*;

public class Main {
	
	static int n, result = Integer.MAX_VALUE;
	static int[] dp;
	static List<Integer> pow;
    public static void main(String []args) throws IOException {        
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	n = stoi(br.readLine());
    	dp = new int[n+1];				// 인덱스는 수, 값은 연산 수
    	
    	pow = new ArrayList<>();
    	
    	for(int i = 1; i <= Math.sqrt(n); i++) {	// 연산이 가능한 제곱 수들을 다 모아놓는다.
    		pow.add(i * i);
    	}
    	
    	Arrays.fill(dp,5);
    	dp[0] = 0;
    	for(int i = 1; i <= n; i++) {
    		for(int num : pow) {
    			if(i - num >= 0) {	//	 현재 수는 해당 제곱 수로 더할 수 있으면
    				dp[i] = Math.min(dp[i - num] + 1, dp[i]);	// 최소 연산 수로 갱신
    			}
    			else
    				break;
    		}
    	}
    	
    	System.out.println(dp[n]);

    	br.close();
    }

    static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점

없습니다.