[백준] 오르막 수 11057번(java) Dynamic_programming

2020-05-14

오르막 수 11057번 (백준 > Dynamic_programming)

문제 링크

문제설명

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

예를 들어, 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

풀이

package Dynamic_programming;

import java.util.*;
public class beak_오르막수 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		//n이 1000까지면, 자리수가 1000...? 이건 배열로도 못만드는데....?
		
		int dp[][] = new int[n+1][10]; //0,1,2,3,4,5,6,7,8,9
		
		//한자리일때는, 자기자신보다 크거나 작은 수가 없으므로 1
		//따라서 한자리일때 계산은 dp[1][]층의 값을 전부 더하면 된다
		for(int i=0; i<10; i++)
			dp[1][i] = 1;
		
		for(int i=2; i<=n; i++) {//i층 =행
			for(int j=0; j<10; j++) {//j =열
				for(int k=0; k<=j; k++) {
					dp[i][j] += dp[i-1][k];
				}
				//나누기 필수
				dp[i][j] %= 10007;
			}
		}
		
		int sum = 0;
		for(int i=0; i<10; i++)
			sum += dp[n][i];
		
		System.out.println(sum);
		
	}//main
}

//참고 블로그
//https://fbtmdwhd33.tistory.com/74

후기 (30min)

모든 갈 수 있는 자리수를 구하려고 했으나 그럼 Math.pow(10,1000)하니 INFINITY가 나옴…ㅎㅎ

그래서 전부 계산하는건 아니라고 생각했고, 갈 수 있는 경우의 수로 체크하려다가 dp(n)(10)까지밖에 생각이 안나서 나머지는 블로그를 참고했다!