728x90
SMALL
백준 문제 풀이: 10844 [쉬운 계단 수]
문제 링크: https://www.acmicpc.net/problem/10844
문제 설명:
길이가 n
인 계단 수를 계산하는 문제입니다. 계단 수는 각 자리 숫자가 인접한 자리와 1 차이가 나는 수를 말합니다. 예를 들어, 45656은 계단 수입니다.
조건: 0으로 시작하는 숫자는 계단 수가 아닙니다. 결과는 1,000,000,000으로 나눈 나머지를 출력합니다.
문제 해결 코드
#include <iostream>
#define MOD 1000000000
using namespace std;
long long dp[101][10]; // dp[i][j]: 길이가 i이고 마지막 숫자가 j인 계단 수의 개수
int main() {
int n;
cin >> n;
// 초기값 설정
for (int i = 1; i <= 9; i++) {
dp[1][i] = 1; // 길이가 1인 경우
}
// DP 점화식 계산
for (int i = 2; i <= n; i++) { // 길이
for (int j = 0; j < 10; j++) { // 마지막 숫자
if (j == 0) {
dp[i][j] = dp[i - 1][j + 1]; // 0은 1만 가능
} else if (j == 9) {
dp[i][j] = dp[i - 1][j - 1]; // 9는 8만 가능
} else {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; // j-1과 j+1에서 오는 경우
}
dp[i][j] %= MOD; // 나머지 연산
}
}
// 결과 계산
long long result = 0;
for (int i = 0; i < 10; i++) {
result += dp[n][i];
result %= MOD; // 나머지 연산
}
cout << result << '\n';
return 0;
}
코드 설명
- 핵심 알고리즘: 동적 프로그래밍을 사용하여 길이가
n
이고 마지막 숫자가j
인 계단 수를 계산합니다. - 구현 세부사항:
dp[i][j]
: 길이가i
이고 마지막 숫자가j
인 계단 수의 개수- 점화식:
dp[i][0] = dp[i-1][1]
: 0 다음에는 1만 올 수 있음dp[i][9] = dp[i-1][8]
: 9 다음에는 8만 올 수 있음dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
(1 ≤ j ≤ 8): j-1과 j+1에서 오는 경우의 합
- 시간 복잡도 분석: O(n × 10)
n
: 숫자의 길이- 10은 각 자리 숫자의 범위
결과
길이가 n
인 계단 수의 개수를 정확히 계산합니다. 동적 프로그래밍과 모듈러 연산을 통해 효율적으로 풀이했습니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 다이나믹 프로그래밍' 카테고리의 다른 글
백준 2240번 [자두나무](C++) -yes6686- 티스토리 (0) | 2024.01.26 |
---|---|
백준 10826번 [피보나치 수 4](C++) -yes6686- 티스토리 (1) | 2024.01.25 |
백준 15486번 [퇴사 2](C++) -yes6686- 티스토리 (1) | 2024.01.24 |
백준 11053번 [가장 긴 증가하는 부분 수열](C++) -yes6686- 티스토리 (0) | 2024.01.23 |
백준 11055번 [가장 큰 증가하는 부분 수열](C++) -yes6686- 티스토리 (0) | 2024.01.23 |