문제
45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
-----------------------------------------------------------------------------------------------------------------------------------
★ 시작하기 전에
dp문제를 풀때. 현재는 아래단계에서 dp 리스트를 만들어 한단계씩 구하는 방식으로 풀고 있다.
재귀로 푸는 습관을 들이려고 하는데 풀이를 잘 모르겠다..
그래도 리스트로 푸는 경우, 규칙을 찾아 실버 1까지는 풀 수 있었다.
한단계씩 규칙을 찾아 냈다.
마지막 자리를 0~9까지의 인덱스를 인자로 생각하고 각 수를 숫자의 갯수로 보자
한자리 : [0, 1, 1, 1, 1, 1, 1, 1, 1, 1] # 0이 0개, 1~ 9는 1개두자리 : [1, 1, 2, 2, 2, 2, 2, 2, 2, 1]
규칙을 보면,0의 갯수는 이전 1의 갯수와 같고 (마지막이 1일 때만 0이 나올 수 있으므로)9의 갯수는 이전 8의 갯수와 같다 (마지막이 8일 때만 9가 나올 수 있다.)나머지는 이전 + 1, - 1 한 숫자를 더하면 된다.즉num1 = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]num2 = [1, 1, 2, 2, 2, 2, 2, 2, 2, 1]
num2[0] = num1[1]
num2[9] = num1[8]
i : 2~8
num2[i] = num1[i-1] + num1[i+1]
n = int(input())
nums = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
i = 1
while i < n:
newnums = [0 for _ in range(10)]
for j in range(10):
if j == 0:
newnums[j] = nums[j+1]
elif j == 9:
newnums[j] = nums[j-1]
else:
newnums[j] = nums[j-1] + nums[j+1]
nums = newnums
i += 1
print(sum(nums)%1000000000)
재귀로 푸는 방식을 익혀보도록 해보자.
'백준_알고리즘' 카테고리의 다른 글
[백준] 2156. DP_포도주시식 - Python (0) | 2021.05.01 |
---|---|
[백준] 17609. 문자열_회문 - Python (0) | 2021.04.10 |
[백준] 2469. 문자열_사다리타기 - Python (0) | 2021.04.06 |
[백준] 14425. 문자열_문자열집합 - Python (0) | 2021.04.01 |
[백준] 9375. 문자열_패션왕신해빈 - Python (0) | 2021.04.01 |