공부 기록

C++ 백준 10844번

by 너나나

계속 다이나믹 프로그래밍에 대해서 풀어보고 있다!!

 

백준 10844번 www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

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

www.acmicpc.net

문제 : 45656이란 수를 보자.

이 수는 인접한 모든 자릿수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.

세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)

 

인접한 모든 자릿수의 차이가 1이 나야 되니까 마지막 수가 i라면 그 앞에는 i-1이나 i+1이 있을 것이다! (단. i 가 1이면 앞에는 무조건 2이고 9라면 무조건 8일 것이다)

그래서 길이가 n이고 마지막 수가 i인 계단수의 개수를 d[n][i]라고 한다면

d[n][i] = d[n-1][i-1] + d[n-1][i+1] 로 표현할 수 있다.

 

#include<iostream>
using namespace std;

long long d[101][10];
long long mod = 1000000000;

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= 9; i++) {
		d[1][i] = 1; // i로 끝나는 길이 1인 계단 수는 한개
	}
	for (int i = 2; i <= n; i++) {
		for (int j = 0; j <= 9; j++) {
			d[i][j] = 0; // 0으로 초기화
			if (j - 1 >= 0) { //j-1==0 이면 d[i-1][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; 
		}
	}
	long long ans = 0;
	for (int i = 0; i <= 9; i++) {
		ans += d[n][i];
	}
	ans %= mod;
	cout << ans << '\n';
}

100000000으로 나눠줘야 하는 거 잊지 말자!!

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

C++ 백준 1912번  (0) 2021.01.02
C++ 백준 2193번  (0) 2021.01.01
C++ 백준 11726번  (0) 2020.12.30
C++ 백준 1463번  (0) 2020.12.30
C++ 백준 2748번  (0) 2020.12.29

블로그의 정보

공부 기록

너나나

활동하기