반응형
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
개요
이 문제는 혼자 골똘히 생각하다가 포기한 문제다.
결국 풀이를 봤는데, 처음에는 이해하지 못 했다.
종이에 여러 번 써보니 이해됐다.
풀이
끝 자리가 0 또는 9일 때는 다음에 붙을 수가 1과 8로 한 가지 밖에 없다.
이외의 수들은 각 2개씩 이어진다.
따라서 각 숫자로 끝나는 수의 개수를 다뤄야 한다.
즉, 단계별 0부터 9까지의 개수를 담는 2차원 배열이 필요하다.
나는 그것을 아래처럼 정의했다.
long long C[100][10]{ {0, 1, 1, 1, 1, 1, 1, 1, 1, 1} };
위 처럼 배열을 정의하면, 값을 지정한 칸을 제외한 남은 칸들은 0으로 초기화 된다.
원래는 memset 함수를 이용했지만 이렇게 하니 편하다.
위에서 지정한 초기값은 N == 1일 때의 값이다. 각각 0부터 9까지의 개수.
점화식은 아래와 같다.
\(C[i][j] = C[i-1][j-1]+C[i-1][j+1]\)
이전 단계의 각 수마다 계단 관계를 갖는 숫자 개수를 늘려주는거다.
예를 들어, i번째 단계의 5는 i - 1번째의 4의 개수와 6의 개수를 합친 것과 같다.
0과 9에 대해서는 out_of_index 오류가 나지 않도록 if문을 이용하여 적절히 처리해준다.
그리고 주의할 점은, \(C[i][j]\)의 값을 정한 이후 1^10의 나머지 연산을 해줘야 한다.
그 뿐만 아니라, 답을 구할 때에도 각 숫자별 개수를 더할 때마다 나머지 연산을 해주지 않으면 문제가 생긴다.
코드
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO cin.tie(NULL); ios::sync_with_stdio(false);
#define FOR(i, N) for(int i = 0; i < N; i++)
#define INF 987654321
#define EL "\n"
int main() {
FAST_IO;
int N;
cin >> N;
long long C[100][10]{ {0, 1, 1, 1, 1, 1, 1, 1, 1, 1} };
for(int i = 1; i < N; i++)
FOR(j, 10) {
if (j > 0)
C[i][j] += C[i - 1][j - 1];
if (j < 9)
C[i][j] += C[i - 1][j + 1];
C[i][j] %= 1000000000;
}
int sum = 0;
FOR(j, 10)
sum = (sum + C[N - 1][j]) % 1000000000;
cout << sum << EL;
return 0;
}
반응형
'프로그래밍 > PS' 카테고리의 다른 글
[C++] 백준 1026번: 보물 (0) | 2020.11.28 |
---|---|
[C++] 백준 11053번: 가장 긴 증가하는 부분 수열 (0) | 2020.11.24 |
[C++] 백준 2156번: 포도주 시식 (0) | 2020.11.23 |
[C++] 백준 2580번: 스도쿠 (0) | 2020.11.22 |
[C++] 백준 16236번: 아기 상어 (0) | 2020.11.01 |