Problem : 쉬운 계단 수
유형 : DP
문제 설명
45656이란 수를 보자. 이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
예제 입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
1 |
|
예제 출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다
1 |
|
해결 전략
계단수의 정의를 자세히 보면 다음과 같음을 추측 할 수 있다.
- 두 자리의 수에서 첫번째의 숫자가 1이면
- 두번째 숫자는 0 또는 2가 된다.
- 만약 세 자리의 수에서 맨 첫번째의 숫자가 5이면
- 두번째 숫자는 4 또는 6이 된다.
큰 문제를 작은 문제로 쪼개서, 해결할 수 있게 된다.
dp[n][m]
길이가 n , 첫번째 수가 m
인접한 수는 +- 1을 해서 찾을 수 있다
dp[n][m] = dp[n][m-1] + dp[n][m+1]
이때 , m-1이나 m+1이 0보다 작거나 9보다 클 수 없다.
예외처리 해준다.
주의할 점
- 맨 앞의 수가 9일때,
-
뒤에 나오는 수는 8만 가능하고
10
은 불가능하다. - 맨 앞의 수가 0일때,
이 경우는 불가능하지만
02
는 불가능 하지만 구해놓아야 한다.102
의 경우에 위에서 구해놓은02
를 이용 해야한다.
- 뒤에 나오는 수는 1만 가능하고
-1
은 불가능하다.
풀이
점화식을 세운다.
dp[n][m]
길이가 n , 첫번째 수가 mdp[n] = dp[n][1~9]의 합
코드
1 |
|
피드백
첫번째 숫자가 아닌, 마지막 숫자를 기준으로 풀이하는것도 괜찮은것 같다.