[백준]#2688 줄어들지 않아

SeungBird·2021년 4월 11일
0

⌨알고리즘(백준)

목록 보기
310/401

문제

어떤 숫자가 줄어들지 않는다는 것은 그 숫자의 각 자리 수보다 그 왼쪽 자리 수가 작거나 같을 때 이다.

예를 들어, 1234는 줄어들지 않는다.

줄어들지 않는 4자리 수를 예를 들어 보면 0011, 1111, 1112, 1122, 2223이 있다. 줄어들지 않는 4자리수는 총 715개가 있다.

이 문제에서는 숫자의 앞에 0(leading zero)이 있어도 된다. 0000, 0001, 0002는 올바른 줄어들지 않는 4자리수이다.

n이 주어졌을 때, 줄어들지 않는 n자리 수의 개수를 구하는 프로그램을 작성하시오.

입력

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

출력

각 테스트 케이스에 대해 한 줄에 하나씩 줄어들지 않는 n자리 수의 개수를 출력한다.

예제 입력 1

3
2
3
4

예제 출력 1

55
220
715

풀이

이 문제는 다이나믹 프로그래밍을 이용해서 풀 수 있었다. 64자릿수가 최대이기 때문에 DP를 이용해서 먼저 계산한 뒤에 입력받은 자릿수의 답을 구했다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        long[] ans = new long[65];
        long[][] dp = new long[65][10];
        for(int i=0; i<=9; i++)
            dp[0][i] = 1;

        for(int i=1; i<=64; i++) {
            for(int j=0; j<=9; j++) {
                if(j==0)
                    dp[i][j] = dp[i-1][j];

                else
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }

            for(int j=0; j<=9; j++) {
                ans[i] = dp[i][j];
            }
        }

        for(int i=0; i<T; i++) {
            int N = Integer.parseInt(br.readLine());
            System.out.println(ans[N]);
        }
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글