fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 1562 (C++) 계단 수
최초 업로드: 2025-07-30 03:19:46
최근 수정 시간: 2025-07-30 03:21:06
게시자: rlatjwls3333
카테고리: 백준
조회수: 2
# [Gold I] 계단 수 [문제 링크](https://www.acmicpc.net/problem/1562) ## 문제 설명 <p>45656이란 수를 보자.</p> <p>이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.</p> <p>N이 주어질 때, 길이가 N이면서 0부터 9까지 숫자가 모두 등장하는 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. 0으로 시작하는 수는 계단수가 아니다.</p> ## 입력 <p>첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.</p> ## 출력 <p>첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.</p> ## 풀이 #### dp[i][j][k]를 마지막 수가 i고, 최소 j 최대 k까지 방문한 계단수의 개수로 두고 풀었습니다. ``` c++ #include<bits/stdc++.h> using namespace std; const long long MOD = 1e9; long long dp[10][10][10]; // dp[i][j][k] : 현재 마지막 수가 i고, 최소 j 최대 k까지 방문한 계단수의 개수 int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i=1;i<=9;i++) dp[i][i][i]=1; // 초기값 while(n-->1) { long long nextDp[10][10][10]; memset(nextDp, 0, sizeof nextDp); for(int i=0;i<=9;i++) { for(int j=0;j<=9;j++) { for(int k=j;k<=9;k++) { if(i-1>=0) nextDp[i-1][min(i-1, j)][k] = (nextDp[i-1][min(i-1, j)][k] + dp[i][j][k]) % MOD; if(i+1<=9) nextDp[i+1][j][max(i+1, k)] = (nextDp[i+1][j][max(i+1, k)] + dp[i][j][k]) % MOD; } } } memcpy(dp, nextDp, sizeof dp); } long long sum=0; for(int i=0;i<=9;i++) sum += dp[i][0][9]; cout << sum % MOD; } ```