본문 바로가기

Algorithm/Baekjoon Oline Judge - Java

[백준] 10844_쉬운계단수 / DP

 

 

Silver

 

 

문제

 

45656이란 수를 보자.

이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자.

0으로 시작하는 수는 계단수가 아니다.

 

 

입력

 

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.

 

 

출력

 

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

 

 


 

풀이

 

import java.util.*;

class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        long M = 1000000000;
        long[][] dp = new long[N][10];
        long count = 0;

        for(int i=1; i<=9; i++ ){
            dp[0][i] = 1;
        }
        
        for(int i=1; i<N; i++ ){
            for(int j=0; j<=9; j++){
                if(j==0) dp[i][j] = dp[i-1][j+1]%M;
                else if(j==9) dp[i][j] = dp[i-1][j-1]%M;
                else dp[i][j] = (dp[i-1][j+1] + dp[i-1][j-1])%M;
            }
        }

        for(int i=0; i<=9; i++ ){
            count = (count + dp[N-1][i])%M;
        }
        
        System.out.println(count);
    }
}

 

 

해결방법

  • 계단수를 구하기 위한 배열 dp를 생성한 후 초기화한다.
    • 이때, dp[i][j]를 길이가 i+1이고 마지막 자릿수가 j인 계단 수의 개수로 정의한다. 
  • 반복문을 통해 길이가 N이면서 맨 끝 숫자가 0~9로 끝나는 계단수를 구한다. 

    길이가 i인 계단 수는 길이가 i-1인 계단 수의 마지막수에 따라 결정된다. 
    길이가 i인 계단수의 맨 마지막 숫자가 0인 경우, 길이가 i-1인 계단 수의 마지막 숫자가 1이어야만 하고,
    길이가 i인 계단수의 맨 마지막 숫자가 9인 경우, 길이가 i-1인 계단 수의 마지막 숫자가 8이어야만 한다. 
    1. if(j==0) dp[i][j] = dp[i-1][1]%M;
    2. if(j==9) dp[i][j] = dp[i-1][8]%M;
    3. dp[i][j] = (dp[i-1][j+1] + dp[i-1][j-1])%M;
  • N자리의 계단의 수는 dp[N-1][0~9]의 합이다. 

 

 

 


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