10844
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
계단 수 : 인접한 모든 자리수의 차이가 1인 수.
여기서 d[n] = 길이가 N인 계단 수의 개수라고 볼 수 있지만, 여기서 우리는 인접한 수의 차이가 1 인것도 고려해야 한다.
그렇다면 마지막 숫자를 배열에 추가하여 d[n][i] = 길이가 n인 계단 수이며, 마지막 숫자가 i인것으로 하여 점화식을 세우면 된다.
처음에 잘못생각해서, 마지막 숫자가 아니라 첫번째 숫자로 생각했더니 문제가 발생했기 때문에... 마지막 숫자라는 것을 유의했으면 좋겠다.
따라서 점화식을 세우면 d[n][i] = d[n-1][i-1] + d[n-1][i+1]이다.
다만, i가 0, 9 일 때에는 d[n][0] = d[n-1][1], d[n][9] = d[n-1][8] 이라는 것에 주의하자.
이중 for문을 돌려서 해당 배열에 값을 넣으면 되는데, 0일때와 9일때를 구별하기 위해서 if 조건문을 추가하였다.
#include <stdio.h>
long long d[101][10];
#define MOD 1000000000
int main(void)
{
int a;
long long ans = 0;
scanf("%d", &a);
for (int i = 1; i < 10; i++)
d[1][i] = 1;
for (int i = 2; i <= a; i++)
{
for (int j = 0; j <= 9; j++)
{
d[i][j] = 0;
if (j - 1 >= 0)
{
d[i][j] += d[i - 1][j - 1];
}
if (j + 1 <= 9)
{
d[i][j] += d[i - 1][j + 1];
}
d[i][j] %= MOD;
}
}
for (int i = 0; i < 10; i++)
{
ans += d[a][i];
}
printf("%d", ans % MOD);
}
'백준 문제풀이' 카테고리의 다른 글
가장 긴 증가하는 부분 수열_ 백준11053 (0) | 2020.07.22 |
---|---|
이친수_2193 (0) | 2020.05.29 |
1, 2, 3 더하기 5_ 백준15990 (0) | 2020.05.26 |
카드구매하기 _ 백준 11052& 백준 16194 (0) | 2020.05.25 |
2xn 타일링 _ 백준 11726, 백준 11727 (0) | 2020.05.23 |