Algorithm/백준

Backjoon(백준) 10844번 - 쉬운 계단 수(Java)

GrapeMilk 2020. 4. 28. 22:32

1. 풀이 힌트 

 - N의 자릿수 길이의 숫자에서 계단 수 조건으로 0부터 9까지의 숫자가 끝에 올 수 있는 횟수를 카운트한다. 앞의 규칙으로 4자리수 까지 구한뒤 비교해보면 규칙이 보일 것이다.

ex) 한 자리수에서 0부터 9까지 숫자가 끝에 올 수 있는 경우의 수

N = 1 일 때 

0 1 2 3 4 5 6 7 8 9
0 1 1 1 1 1 1 1 1 1

2. 풀이 과정

 - 한 자리수 부터 네자리 까지 0 ~ 9의 숫자가 끝에 올수 있는 경우의 수를 나열하면 밑과 같다

0 1 2 3 4 5 6 7 8 9 // 0 ~ 9까지
0 1 1 1 1 1 1 1 1 1 // N = 1
1 2 2 2 2 2 2 2 2 1 // N = 2
2 3 4 4 4 4 4 4 3 2 // N = 3
3 6 7 7 7 7 7 7 6 3 // N = 4

 1) 위와 같은 결과를 점화식으로 도출하면 dp[N][i] = dp[N - 1][i - 1] + do[N - 1][i + 1]이 된다 (i >= 1 and i <= 10)

 2) 코드로 구현할 때는 2차원 배열을 선언하여 각 자리수 N의 0 부터 9까지 끝이 올 수 있는 자릿수를 저장한다.

 *dp[N][i] : N : N크기의 자리 숫자를 나타냄. i: 0부터 9까지 끝에 올 수 있는 자리 수.

 3) 2차원 배열의 크기를 선언할 때 주의할 점

  3-1) 0으로 끝나는 수 카운트

   - 0으로 끝나는 수를 카운트 하기 위해서는 이전 자리 값인 -1의 끝자리가 필요 한데, -1 끝자리는 존재할 수 없는 수이기 때문에 배열의 시작점을 i = 1으로하여 0으로 끝나는 수를 카운트 할때 0의 값을 갖는 i = 0번째 값을 더해 줄 수 있도록 한다. 

  3-2) 9로 끝나는 수 카운트

 - 9로 끝나는 수를 카운트할 때도 마찬가지로, 9다음의 수 10이 없기 때문에 배열의 크기를 최대 12로 선언하여 i = 10이 됐을 때 0의 값을 같는 i = 11값들을 더할 수 있게 설정한다.

3. 코드 구현

  - 각 배열에 값을 넣을 때 MOD를 나누고 sum을 계산 하면서 한번 더 MOD로 나눠주어 계산하는 결과와 sum을 계산할 때 만 MOD를 계산하는 결과는 같지만, int의 범위를 넘지 않기 위해 dp를 계산할 때도 MOD를 나눠준다.

package dp2.backjoon;

import java.util.Scanner;

public class Main {
    
    static final int MOD = 1000000000;

    public static void main(String[] args) {
        
        int[][] dp = new int[101][12];
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        for (int i = 1; i <= 9; i++) {
            dp[1][i] = 1;
        }
        
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= 10; j++) {
                dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % MOD; //1) MOD
            }
        }
        
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum = (sum + dp[n][i]) % MOD; //2) MOD
        }
        
        System.out.println(sum);

    }

}

 문제 링크 ( https://www.acmicpc.net/problem/10844 )

 

* 참고 블로그

( https://sihyungyou.github.io/baekjoon-10844/ )

 

* What is 1E10? 

( https://www.quora.com/What-is-1E10 )

If it is scientific notation, the easiest way to think of it is the ‘E’ stands for ‘times 10 raised to the … power’, so this would be 1 times 10 raised to the 10th power (or 1 followed by 10 zeros)

Thus 1E10 is 10,000,000,000