본문 바로가기
알고리즘/백준

백준 11057번 - 오르막 수 (Java)

by latissimus 2022. 3. 30.

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

 

11057번: 오르막 수

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수

www.acmicpc.net

코드 :

1. dp - top down

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

public class Main {
    public static final int MOD = 10_007;
    static long[][] dp;

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

        //dp[N][num] = 길이가 N인 오르막수의 마지막 수가 num일때 경우의 수
        dp = new long[N+1][10];
        for (int i = 0; i < 10; i++) {
            dp[1][i] = 1;
        }

        int result = 0;
        for (int i = 0; i < 10; i++) {
            result += recur(N, i);
            result %= MOD;
        }
        System.out.println(result);
    }

    public static long recur(int N, int num){
        if(dp[N][num] == 0){
            for (int i = 0; i < 10; i++) {
                for (int j = 0; j <= i; j++) {
                    dp[N][i] += recur(N - 1, j);
                    dp[N][i] %= MOD;
                }
            }
        }
        return dp[N][num] % MOD;
    }
}

 

2. dp - bottom up

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

public class Main {
    public static final int MOD = 10_007;
    static long[][] dp;

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

        dp = new long[N+1][10];
        for (int i = 0; i < 10; i++) {
            dp[1][i] = 1;
        }

        for (int i = 2; i < N+1; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k <= j; k++) {
                    dp[i][j] = (dp[i][j] + dp[i - 1][k] % MOD);
                }
            }
        }
        int answer = 0;
        for (int i = 0; i < 10; i++) {
            answer += dp[N][i];
            answer %= MOD;
        }
        System.out.println(answer);
    }
}

 

 

댓글