Backjoon Online Judge 

"1005번 : 쉬운 계단 수" 문제입니다.


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


쉬운 계단수에서 인접한 자리만을 쉽게 접근하기 위해 배열을 사용했습니다.

각 자리수 별로 계단 수를 구하고 ( 0자리 수 : -1, 1자리 수 : 1로 초기화)

더 큰 자리수는 이전 자리수에서 값을 더하는 DP 방식을 이용했습니다.

자리수가 0과 9일때는 인접한 자리수가 1개이고, 1~8 사이의 수일때는 인접한 자리수가 2개인 것을 활용했습니다.


아래는 코드 설명입니다.

 - 먼저 자리수가 0일때와 1일때 계단수를 초기화 했습니다.

 - 자리수가 2 이상 일때 첫자리 숫자에 따라 나올 수 있는 계단수를 DP를 통해 구했습니다. (1 차이 나는 이전 자리수를 더해주기만 하면 됩니다.)

 - 계단수의 크기가 1,000,000,000을 넘을 경우를 대비하여 덧셈 수행 마다 1,000,000,000으로 나눈 나머지를 저장하도록 했습니다.

(문제는 쉬웠지만 result 값을 0으로 초기화 해주지 않는 실수로 시간을 낭비했습니다. 실수 하지 않도록 체크)


코드는 C++로 작성하였습니다.

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
#include <iostream>
#define MAX 1000000000
 
using namespace std;
 
int main() {
    int N;
    long long int result = 0;
    long long int num[101][10= { {-1-1-1-1-1-1-1-1-1-1} ,
    {1111111111} };
    cin >> N;
    for (int i = 2; i <= N; i++) {
        for (int j = 0; j<10; j++) {
            if (j == 0) {
                num[i][j] = num[i - 1][1];
            }
            else if (j == 9) {
                num[i][j] = num[i - 1][8];
            }
            else {
                num[i][j] = (num[i - 1][j - 1+ num[i - 1][j + 1]) % MAX;
            }
        }
    }
    for (int i = 1; i < 10; i++) {
        result = (result + num[N][i]) % MAX;
    }
    cout << result << endl;
    return 0;
}

cs


'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글

7576번 : 토마토  (0) 2018.05.16
2293번 : 동전 1  (0) 2018.05.15
1005번 : ACM Craft  (0) 2018.05.12
1463번 : 1로 만들기  (0) 2018.05.10
2579번 : 계단 오르기  (0) 2018.05.05