45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
#include <iostream>
using namespace std;
/* 조건 */
#define DIVISOR 1000000000
#define MAX_N 101
/* 변수 */
int N, arr[MAX_N][10];
int result = 0;
int main() {
/* 입력 */
cin >> N;
/* 풀이 */
for(int i = 0; i < 10; i++) {
arr[1][i] = 1;
}
for(int i = 2; i <= N; i++) {
arr[i][0] = arr[i-1][1]%DIVISOR;
for(int j = 1; j < 9; j++) {
arr[i][j] = (arr[i-1][j-1]%DIVISOR) + (arr[i-1][j+1]%DIVISOR);
}
arr[i][9] = arr[i-1][8]%DIVISOR;
}
for(int i = 1; i < 10; i++) {
result += arr[N][i]%DIVISOR;
result %= DIVISOR;
}
/* 출력 */
cout << result << '\n';
}
문제에서 제시된 계단수를 구하는 것은 한자릿수부터 N자릿수까지 각 숫자별로(0부터 9까지)하나씩 구해보면 쉽게 구할 수 있다.
예를 들어, 3자리 숫자 중 4로 시작하는 계단수는 2자리 숫자 중 3과 5로 시작하는 계단수를 4 뒤에 붙인 43_과 45_가 된다.
위와 같이 한자릿수부터 각 숫자마다 더해가면 N자리숫자까지 구할 수 있을 것이다.
그리고, 숫자가 점점 커져 int의 범위를 넘어가기 때문에 정답을 1,000,000,000으로 나눈 나머지를 출력하도록 되어있으므로, 중간 중간 계산과정에 1,000,000,000을 나눠 나머지로 계산해주면 된다.
for(int i = 0; i < 10; i++) {
arr[1][i] = 1;
}
for(int i = 2; i <= N; i++) {
arr[i][0] = arr[i-1][1]%DIVISOR;
for(int j = 1; j < 9; j++) {
arr[i][j] = (arr[i-1][j-1]%DIVISOR) + (arr[i-1][j+1]%DIVISOR);
}
arr[i][9] = arr[i-1][8]%DIVISOR;
}
for(int i = 1; i < 10; i++) {
result += arr[N][i]%DIVISOR;
result %= DIVISOR;
}
백준 [10844] 쉬운 계단 수
https://www.acmicpc.net/problem/10844