알고리즘

백준 2688번 줄어들지 않아 (JAVA)

박카스마시며코딩 2022. 7. 27. 20:41

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

 

2688번: 줄어들지 않아

첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)이 주어진다. 각 테스트 케이스는 숫자 하나 n으로 이루어져 있다. (1 <= n <= 64)

www.acmicpc.net

 

저는 DP를 이용해 해당 문제를 해결하였습니다.

 num은 해당 자리 수를 뜻하며, 저는 두번째 인덱스로 맨 앞 숫자를 표현하고 이에 대한 개수를 저장하였습니다.

마지막으로 10은 num에 해당하는 자리 수의 결과 값입니다.

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_2688 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        int test = stoi.apply(br.readLine());
        long[][] dp = new long[64 + 1][10 + 1];
        for(int i = 0 ; i < 10 ; i++){
           dp[1][i] = 1;
        }
        dp[1][TOTAL_SUM_INDEX] = 10;
        for(int t = 0 ; t < test ; t++){
            int num = stoi.apply(br.readLine());
            System.out.println(cal(num,dp));
        }
    }

    private static final long NOT_VALID = 0;
    private static final int TOTAL_SUM_INDEX = 10;

    private static long cal(int num, long[][] dp) {
        if(dp[num][TOTAL_SUM_INDEX] != NOT_VALID){
            return dp[num][TOTAL_SUM_INDEX];
        }
        if(dp[num-1][TOTAL_SUM_INDEX] == NOT_VALID){
            cal(num-1,dp);
        }
        for(int i = 0 ; i < 10 ; i++){
            for(int j = i ; j < 10 ; j++){
                dp[num][i] += dp[num-1][j];
                dp[num][TOTAL_SUM_INDEX] += dp[num-1][j];
            }
        }
        return dp[num][TOTAL_SUM_INDEX];
    }
}