ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 17626번 - Four Squares
    알고리즘/백준 2023. 6. 25. 20:33

    1️⃣ DP

     

    ✏️ 풀이 과정

    중복조합을 떠올리기 쉽지만 n이 50000일 때 1부터 106까지에서 조합을 고려해야하기 때문에 계산할 수 없을만큼 경우의 수가 많습니다.

     

    다이나믹 프로그래밍을 이용한다면 106개에 대해 50000번,(실제로는 1~106의 제곱수부터 시작하기 때문에 이보다 적습니다.) 즉 530만번 가량의 계산으로 시간 초과를 내지 않고 해결할 수 있습니다.

     

    아이디어는 Knapsack문제와 똑같이 1부터 1만 있을 때의 50000까지의 조합 수를 배열에 계산하고 2가 추가되었을 때의 최솟값을 다시 각 인덱스의 값을 4이전 인덱스에서 1을 더한 것과 비교하는 식으로 반복하는 것입니다. 주어진 n의 루트값(버림을 통해 정수로 만든)까지 이 과정을 반복하면 배열의 n번째 인덱스에(n+1개 선언한 경우) 답이 저장됩니다.

    💻 코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int n = Integer.parseInt(br.readLine());
    		int root = (int)Math.sqrt(n);
    		int[] dp = new int[n+1];
    		int pow;
    		for(int i=1;i<=n;i++) {
    			dp[i] = i;
    		}
    		for(int i=2;i<=root;i++) {
    			pow = i * i;
    			for(int j=pow;j<=n;j++) {
    				if(dp[j-pow] + 1 < dp[j]) {
    					dp[j] = dp[j-pow] + 1;
    				}
    			}
    		}
    		System.out.println(dp[n]);
    		br.close();
    	}
    }

    '알고리즘 > 백준' 카테고리의 다른 글

    14940번 - 쉬운 최단거리  (0) 2023.06.26
    14500번 - 테트로미노  (0) 2023.06.26
    17219번 - 비밀번호 찾기  (0) 2023.06.24
    11727번 - 2×n 타일링 2  (0) 2023.06.23
    11726번 - 2×n 타일링  (0) 2023.06.22
Designed by Tistory.