본문 바로가기

알고리즘/BOJ

10844번

10844번 - 쉬운 계단 수


DP를 이용해서 풀었다.

처음에 완전탐색으로 풀고, 시간초과로 인해 메모이제이션을 사용하는 DP로 풀게 됐다.

이차원 DP를 이용해서

D[N][L] = N자릿수, 마지막 숫자가 L인 쉬운 계단 수의 가짓수.


이 문제에서 발견한 나의 실수 2가지


1. 아직도 기저 사례에 대해서 완벽하게 하지 않고 풀었다.

=> 이번 문제의 경우 N이 1일 때, 첫번째 자리에 0이 들어가면 안된다는 조건을 까먹고 자꾸 갯수가 +1 되는 것을 처음부터 생각하지 못함.


2. int값을 벗어나는 변수일 경우, long long 타입을 해줘야 하는데 그걸 잊었다. 삼성 기출 문제에서도 이런식으로 변수값을 벗어나는 문제가 있었는데

그때도 틀렸던 점을 다시 잊고 틀렸다.





<정답 코드>


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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include<string.h>
 
#define mod 1000000000;
using namespace std;
 
int N;
long long ans;
long long D[101][10];
int go(int n,int num)
{
    if (n == 1 && num == 0)
    {
        return 0;
    }
    if (n == 1 && num !=0)
    {
        return 1;
    }
 
    if (D[n][num] != -1)
    {
        return D[n][num];
    }
 
 
    if (num == 0)
    {
        D[n][num] = go(n - 1, num + 1) % mod;
    }
    
    else if (num == 9)
    {
        D[n][num] = go(n - 1, num - 1) %mod;
    }
    else
    {
        D[n][num] = (go(n - 1, num + 1+ go(n - 1, num - 1)) % mod;
    }
 
    return D[n][num];
}
int main()
{
    memset(D, -1sizeof(D));
    cin >> N;
 
 
    {
        for (int i = 0; i < 10; i++)
        {
            ans += go(N, i);
        }
    }
 
    cout << ans % 1000000000 << endl;
    
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

2193번  (0) 2017.11.15
11057번  (0) 2017.11.15
9095번  (0) 2017.11.14
11727번  (0) 2017.11.14
11726번  (0) 2017.11.14