ALGORITHM/BOJ

[백준] 11057 오르막 수

0298 2020. 11. 19. 22:23

www.acmicpc.net/problem/11057

 

11057번: 오르막 수

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

www.acmicpc.net

import java.util.Scanner;

public class Main11057 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		
		int answer = 0;
		int dp[][] = new int[N+1][10];
		if(N == 1) answer = 10;
		else if(N == 2) answer = 55;
		else {
			for(int i = 0; i < 10; i++) {
				dp[1][i] = 1;
				dp[2][i] = i;
			}
			
			for(int i = 3; i <= N; i++) {
				for(int j = 1; j < 10; j++) {
					dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % 10007;
				}
			}
			
			for(int j = 1; j <= N; j++) {
				for(int i = 0; i < 10; i++) answer += (dp[j][i] % 10007);
			}
		}
		System.out.println(answer % 10007);
	}
}

 

길이별로 0~9까지의 끝자리수를 계산 할 수 있도록 2차원 배열을 만들었다.

 

 

이런식으로 각각의 길이에 끝자리 수 별로 몇 개의 오르막 수가 있는지 세어 보면 규칙을 찾을 수 있다.

 

dp[3][9] = 45 = dp[2][9] + dp[2][8] + dp[2][7] + ..... + dp[2][1]

 

여기서 dp[2][8] + dp[2][7] + ..... + dp[2][1] 같은 경우에는 dp[3][8]이라고도 할 수 있다.

 

 

dp[3][1] = 1 = dp[2][1] + dp[3][0]

dp[3][2] = 3 = dp[2][2] + dp[3][1] = 2 + 1

dp[3][3] = 6 = dp[2][3] + dp[3][2] = 3 + 3

...

dp[3][9] = 45 = dp[2][9] + dp[3][8]

 

이 규칙을 점화식으로 아래와 같이 풀 수 있다.

	for(int i = 3; i <= N; i++) {
			for(int j = 1; j < 10; j++) {
				dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % 10007;
		}
	}

 


%10007 부분을 처음에는 정답에만 넣어서 틀렸었다. 숫자를 계산할 때도 꼭 추가를 해줘야한다.