티스토리 뷰

문제링크

📝 문제

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.

예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.

입력

첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.

출력

첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.

예제 입력 1

1

예제 출력 1

10

예제 입력 2

2

예제 출력 2

55

예제 입력 3

3

예제 출력 3

220


🔍 정답

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

public class Main {

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

        /**
         * dp배열의 값은 [N자릿수][첫자리숫자] 일 때 경우의 수를 입력할 것이다.
         * 예를 들어서 [2][2] 인 경우는 두 자릿수이면서 첫자리가 2인 경우의 개수이므로 22, 23, 24, 25, 26, 27, 28, 29 로 8이 된다.
         */
        int[][] dp = new int[N+1][10];

        /**
         * 한자릿수의 경우 올 수 있는 수는 자기 자신 하나밖에 없으므로 모두 1로 초기화를 해준다!
         */
        for (int i = 0; i < 10; i++) {
            dp[1][i] = 1;
        }

        /**
         * # 자릿수 [1][0~9] : 0 1 2 3 4 5 6 7 8 9 (10개)
         * # 자릿수 [2][0] : 00, 01, 02 ~ 09 (10개)
         *   자릿수 [2][1] : 11, 12, 13 ~ 19 (9개)
         *   자릿수 [2][2] : 22, 23, 24 ~ 29 (8개)
         * 규칙을 찾아보면, 이전 자릿수의 같은 숫자 ~ 9까지의 개수 합이 된다는 것을 알 수 있다! ([2][3]은 [1][3~9] 까지의 합)
         */
        for (int i = 1; i <= N; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = j; k < 10; k++) {
                    dp[i][j] += dp[i-1][k] % 10007;
                }
            }
        }

        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += dp[N][i];
        }
        System.out.println(sum % 10007);
    }
}

❌ 처음 풀이

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

public class Main {
    static int N;
    static int[] number;
    static int[] output;
    static int count = 0;

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

        number = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        output = new int[N];

        if (N == 1) {
            count = number.length;
            System.out.println(count % 10007);
            return;
        }

        dfs(0);
        System.out.println(count % 10007);
    }

    public static void dfs(int depth) {
        if (depth == N) {
            for (int i = 0; i < N-1; i++) {
                if (output[i] > output[i + 1]) {
                    return;
                }
            }
            count++;
            return;
        }

        for (int i = 0; i < 10; i++) {
            output[depth] = number[i];
            dfs(depth+1);
        }
    }
}
  • 처음엔 dfs로 풀었는데 시간초과가 나더라...
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함