[백준][2225번] 합분해

Updated:

문제 URL

https://www.acmicpc.net/problem/2225 boj2225

나의 풀이

package backjoon;

import java.util.Scanner;

public class Main {
    public static int[] d;
    public static final int mod = 1000000000;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        //d[i] = O부터 n까지 더 해서 합이 i가 되는 경우의 수
        d = new int[n + 1];

        for (int i = 0; i <= n; i++)
            d[i] = 1;

        //2번 더하는경우 부터 k번째 더하는 경우까지 순차적으로
        for (int i = 2; i <= k; i++) {
            //뒷요소부터 계산한다. k-1번째 더 해진 앞요소들을 탐색해야하기때문.
            for (int j = n; j >= 1; j--) {
                for (int a = 0; a < j; a++) {
                    d[j] += d[a];
                    d[j] %= mod;
                }
            }
        }

        System.out.println(d[n]);
    }
}

다른 풀이 **

import java.util.*;
import java.math.*;

public class Main {
    public static long mod = 1000000000L;
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        long[][] d = new long[k+1][n+1];
        d[0][0] = 1;
        for (int i=1; i<=k; i++) {
            for (int j=0; j<=n; j++) {
                for (int l=0; l<=j; l++) {
                    d[i][j] += d[i-1][j-l];
                    d[i][j] %= mod;
                }
            }
        }
        System.out.println(d[k][n]);
    }
}

느낀점

동적계획법 을 이용한 문제다.

내가한것 보다 괜찮은 다른풀이를 보았다. 2차원배열을 활용하는 것이다.

백준강의 say, 난이도가 낮을수록 문제에서 구해야하는 것을 점화식으로 그대로 옮기 완성되는 경우가 많다. ex) D[K][N] = 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수

boj2225a

  • 시간복잡도 : O(KN제곱)

Leave a comment