반응형
12-12 21:13
Today
Total
«   2024/12   »
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
관리 메뉴

개발하는 고라니

[백준] 11057번 : 오르막 수 본문

Programming/백준

[백준] 11057번 : 오르막 수

조용한고라니 2021. 2. 4. 16:20
반응형
 

11057번: 오르막 수

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

www.acmicpc.net

# 문제

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

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

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

# 입력

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

# 출력

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

# 예제 입력

1

# 예제 출력

10


[동적 프로그래밍]

점화식을 찾는데 애를 먹었던 문제이다. 언뜻 보기에 구하기 쉬울 것 같으나 막상 점화식을 써보자면 들어맞지가 않았다.

 

일단 int dp[1001][10]이라는 2차원 배열을 준비한다. dp[i][j]에서 i는 i자리 수를 의미하고, j는 j로 시작하는 수 이다. 그럼 dp[100][5]는 100자리 수 중 5로 시작하는 오르막 수의 개수를 나타내는 것을 의미한다.

 

조건을 잘 봐야하는 것이, 0으로 시작할 수 있고, 인접한 수와 같은 수 여도 오르막 수 이다. 그리고 몇 자리 수이든 9로 시작하면 오르막 수는 단 1개임을 명심하자.

 

# 1자리 수 일 때 오르막 수는, 0~9까지 한 자리씩만 가지므로 모두 1이다.

 

# 2자리 수 일 때 오르막 수

00 01 02 03 04 05 06 07 08 09 -> 10개

11 12 13 14 15 16 17 18 19 -> 9개

22 23 24 25 26 27 28 29 -> 8개

33 34 35 36 37 38 39 -> 7개

...

88 89 -> 2개

99 -> 1개

가 되겠다. 따라서 dp[2][0]은 dp[1][0] + dp[1][1] + dp[1][2] + dp[1][3] + ... + dp[1][9]이다.

그럼 dp[2][1]은?

dp[1][1] + dp[1][2] + dp[1][3] + ... + dp[1][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

문제 해결!

#  Code </>

public class Main {

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

        IntStream.range(0, 10).forEach(i->dp[1][i] = 1);

        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] % 10007;

        System.out.println(sum % 10007);
    }
}
반응형
Comments