www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net


  • 재귀호출로 각 자릿수에서 가능한 다음 위치들을 계산해나가면 아주 간단하게 풀 수 있지만, 시간초과가 난다.
  • n 번째 자릿수에 들어갈 수 있는 값들은 n-1 번째 자릿수에 의해 결정된다. (0 과 9 의 경우는 1개씩, 나머지는 2개씩)
  • 각 자릿수별로 가능한 숫자들을 저장할 배열을 만들어, 첫 자릿수부터 채우며 다음 자릿수를 결정한다.

#include <iostream>

using namespace std;

int n;
unsigned long long answer;
unsigned long long data[2][10];                     // 10개의 열은, 0~9 까지 각각 몇개의 숫자가 가능한지 담아놓음

int main(void)
{
    cin >> n;
    for(int i = 1 ; i <= 9 ; i++)                   // 0 으로 시작할 수 없기 때문에 1~9 까지만 가능한 숫자
    {
        data[1][i] = 1;
    }
    for(int digit = 2 ; digit <= n ; digit++)       // n 의 자리까지 
    {
        data[digit%2][0] = data[(digit+1)%2][1];    // 0 는 직전 자릿수의 +1 위치 (1) 의 값만을 더함
        data[digit%2][9] = data[(digit+1)%2][8];    // 9 는 직전 자릿수의 -1 위치 (8) 의 값만을 더함
        for(int i = 1 ; i <= 8 ; i++)               // 1~8 까지는 직전 자릿수의 (-1/+1) 위치의 값들을 더함
        {
            data[digit%2][i] = (data[(digit+1)%2][i-1] + data[(digit+1)%2][i+1]) % 1000000000;
        }
    }
    for(int i = 0 ; i <= 9 ; i++)
    {
        answer = (answer + data[n%2][i]) % 1000000000;  // 해당 자릿수에서 가능한 숫자의 갯수들을 모두 더함
    }
    cout << answer << endl;
}

'PS > BOJ' 카테고리의 다른 글

[백준] 1043.cpp : 거짓말  (0) 2020.08.17
[백준] 1912.cpp : 연속합  (0) 2020.08.16
[백준] 2003.cpp : 수들의 합 2  (0) 2020.08.14
[백준] 16953.cpp : A -> B  (0) 2020.08.10
[백준] 11660.cpp : 구간 합 구하기 5  (0) 2020.08.07

+ Recent posts