반응형
문제
45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.
문제풀이
n=int(input())
#01
dp=[[0]*10 for _ in range(n+1)]
for i in range(1,10):
dp[1][i]=1
for i in range(2,n+1):
#02
for j in range(10):
if j==0:
dp[i][j]=dp[i-1][1]
elif j==9:
dp[i][j]=dp[i-1][8]
#03
else:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]
#04
print(sum(dp[n])%1000000000)
- #01 : dp 리스트에 [0]을 10개씩 묶음 것을 n개만큼 만들어 저장한다.
dp[1]의 값은 0을 제외하고 모두 계단 수 이기에 모두 1로 저장한다.
참고로 dp의 값은 계단 수를 누적으로 쌓아가며 최종적으로
dp[n]일 때의 계단 수를 구하는 것이다.
- #02 : j가 0인 경우 즉 뒷자리가 0으로 끝나는 값은 앞에 1만 올 수 있다.
j가 9인 경우 즉 뒷자리가 0으로 끝나는 경우는 앞에 8만 가능하다.
- #03 : 그 외 1~8까지는 앞자리가 +1, -1한 값이 모두 계단 수이기에
dp[i][j] = d[i-1][j-1] + dp[i-1][j+1]을 해준다.
- #04 : 최종적으로 dp[n][0~9]까지 각각에 가능한 계단 수가 저장되어있다.
이를 sum하여 1,000,000,000으로 나눈 값을 출력한다.
'프로그래밍 > 백준' 카테고리의 다른 글
[알고리즘] 백준 1822 파이썬 - 차집합 (2) | 2023.04.02 |
---|---|
[알고리즘] 백준 5636 파이썬 - 소수 부분 문자열 (2) | 2023.04.01 |
코딩테스트 - 알고리즘 공부 순서 (2) | 2023.03.31 |
[알고리즘] 백준 1094 파이썬 - 막대기 (2) | 2023.03.30 |
[알고리즘] 백준 25496 파이썬 - 장신구 명장 임스 (2) | 2023.03.29 |