본문 바로가기

알고리즘/DP(Dynamic programming, 동적프로그래밍)

백준(BOJ) 2407: 조합

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

기초문제로 BigInteger타입과 그 연산( dp[i][j]=dp[i-1][j-1].add(dp[i-1][j]); )방식에 대해 알아두기.

BigInteger에 대하여https://coding-factory.tistory.com/604#google_vignette

==>> int는 메모리 크기는 4byte로 표현할 수 있는 범위는 -2,147,483,648 ~ 2,147,483,647이고 long은 메모리 크기는 8byte로 표현할 수 있는 범위는 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807입니다. 그 범위를 넘어서게 되면 모두 0으로 출력이 됩니다. 숫자의 범위가 저 범위를 넘을 경우는 잘 없겠지만 프로그램 개발 특히 돈과 관련된 개발이나 알고리즘 문제를 풀 때 항상 최악의 상황을 고려해야 하므로 무한의 정수가 들어갈 수 있는 가능성이 있다면 BigInteger이라는 클래스를 활용하는 것이 좋습니다. BigInteger은 문자열 형태로 이루어져 있어 숫자의 범위가 무한하기에 어떠한 숫자이든지 담을 수 있습니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Testing3{
    public static void solution(int n, int m){
        //nCr=n-1Cr-1+n-1Cr
        BigInteger[][]dp=new BigInteger[n+1][n+1];
        for(int i=1;i<n+1;++i){
            for(int j=0;j<i+1;++j){
                if(j==0 ||j==i){
                    dp[i][j]=BigInteger.ONE;
                    continue;
                }
                dp[i][j]=dp[i-1][j-1].add(dp[i-1][j]);
            }
        }
        System.out.println(dp[n][m]);
    }
    public static void main(String[] args) throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(br.readLine());
        int n=Integer.parseInt(st.nextToken());
        int m=Integer.parseInt(st.nextToken());
        solution(n,m);
    }
}