문제 풀이/백준

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

27200 2025. 6. 11. 15:29

문제

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


풀이(18분)

import java.io.*;
import java.util.*;

public class Main {

    /**
     * 한자리수는 0 1 2 3 4 5 6 7 8 9
     * 두자리수는
     * 00 01 02 03 04 05 06 07 08 09
     * 11 12 13 14 15 16 17 18 19
     * 22 23 24 ... 이런 식
     * 즉 10 *
     */

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());

        for(int i = 0; i < t; i++){
            int n = Integer.parseInt(br.readLine());
            long[][] arr = new long[n+1][10]; // n+1행에 대해 0~9까지의 자릿수
            for(int j = 0; j < 10; j++){
                arr[1][j] = 1; // 한자릿수 모두 1로 초기화
            }
            for(int j = 2; j <= n; j++){
                long sum = 0;
                for(int k = 9; k >= 0; k--){
                    sum += arr[j-1][k];
                    arr[j][k] = sum;
                }
            }
            long answer = 0;
            for(int j = 0; j < 10; j++){
                answer += arr[n][j];
            }
            System.out.println(answer);
        }
    }
}

문제 풀이 전략

 

줄어들지 않는 숫자를 만드는 것이 중요하다.

그 말은 앞자리에 새로운 숫자를 추가할 때마다 이 전 자릿수들에 대한 고려를 할 수 있다는 것이다.

 

예를 들어 생각해 보자.

1. 한자릿수는 0 1 2 3 4 5 6 7 8 9로 반드시 줄어들지 않게 된다.

2. 두 자릿수는 어떻게 될까? 1의 자리가 9라면 반드시 9만 들어올 수 있고, 8이라면 8,9가 되고, 7이라면 7,8,9가 된다.

즉, DP 규칙을 찾아낼 수 있게 된 것이다!

 

최종적으로 자릿수에 따른 배열을 만들어 해결할 수 있다.