Post

[백준] 10844번_쉬운 계단 수(Java)

문제 풀이

백준의 10844번 문제입니다. 문제 출처

(1) 문제 파악

q

계단 수란 인접한 자리끼리의 차이가 모두 1인 수를 의미하며, 길이가 N인 계단 수의 개수를 찾는 문제입니다.

(2) 문제 풀이 방법 생각하기

0~9까지의 정수 중 09를 주의해야 합니다.

q1

  • 0 다음에는 반드시 1이 옵니다 -> \(arr[N][0] = arr[N-1][1]\)
  • 9 다음에는 반드시 8이 옵니다 -> \(arr[N][9] = arr[N-1][8]\)

0과 9를 제외한 수는 다음 자리에 자기 자신 -1+1한 값을 다음 수로 가질 수 있습니다.

\[arr[N][1] = arr[N-1][0] + arr[N-1][2]\]

이 규칙을 그대로 코드로 옮겨주면 됩니다!

(3) 시간 복잡도 확인

시간 제한은 2초 입니다. 즉, 대략 2억번 연산 안에 문제를 해결해야 합니다.

dp에 대한 계산을 위해 for문이 중첩되어 사용되지만 O(N*10) 이므로 O(N) 시간 복잡도를 가집니다.

(4) 구현

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
32
33
34
35
import java.io.*;

public class Main {
    static final long MOD = 1_000_000_000;

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

        for(int i=1; i<10; i++) {
            // 한 자리 수는 무조건 계단 수가 1개니까
            dp[1][i] = 1;
        }

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

        long result = 0;
        for(int i=0; i<10; i++) {
            result += dp[N][i];
        }
        System.out.println(result % MOD);

        br.close();
    }
}
This post is licensed under CC BY 4.0 by the author.

Comments