본문 바로가기
알고리즘/DP

[java 백준] 실버 1/11057번 오르막수

by Meaning_ 2021. 8. 2.
728x90
반응형

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

 

11057번: 오르막 수

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

www.acmicpc.net

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
31
32
33
34
35
36
37
38
39
40
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
 
    public static int n;
    public static long[][] dp;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        n = Integer.parseInt(br.readLine());
        dp = new long[n + 2][10];
 
        for (int i = 0; i < 10; i++) {
            dp[1][i] = 1;
        }
        for (int i = 2; i <= n; i++) {
            for (int j = 0; j <= 9; j++) {
                int num = 0;
                int total = 0;
                while (num <= j) {
                    total += (dp[i - 1][num]) % 10007;
 
                    num++;
                }
                dp[i][j] = total % 10007;
 
            }
        }
        long count = 0;
        for (int i = 0; i < 10; i++) {
            count += (dp[n][i]) % 10007;
        }
        System.out.println(count % 10007);
 
    }
 
}
cs

처음으로 혼자 규칙을 찾아내서 풀어본 문제였다!

 

 이 규칙을 점화식으로 만들어서 코드를 짜보면

 

for (int i = 2; i <= n; i++) {

            for (int j = 0; j <= 9; j++) {

                int num = 0;

                int total = 0;

                while (num <= j) {

                    total += (dp[i - 1][num]) % 10007;

 

                    num++;

                }

                dp[i][j] = total % 10007;

 

            }

        }

728x90
반응형

댓글