Notice
Recent Posts
Recent Comments
Link
꾸준하게 거북이처럼
백준 10844번 파이썬 - 쉬운 계단 수 본문
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
최근 DP 문제를 풀기 시작했고, 점화식 찾는데 익숙하지 않아서 1시간 이상 붙잡다가 매번 문제풀이를 봤다.. 문제는 풀 때 최대 1시간 ~ 1시간 반까지만 생각하고 풀이가 떠오르지 않으면 문제 풀이를 찾아보는 식으로 스스로 정했다.
이번에는 꼭 뭔가 풀 수 있을 것 같다는 생각이 들어 1시간 반 가까이 생각해서 이전에 풀었던 문제풀이를 활용해서 문제를 풀 수 있었다.
2차원 배열을 이용하는 것이다.
d[i][j] : 자리수가 i(1개 ~ 100개) 개인 수에서 마지막 자리수가 j ( 0 ~ 9까지) 로 끝나는 계단 수가 총 몇 개인지 의미.
즉 d[i] 는 자리수가 i 개인 숫자들 중에서 계단 수가 몇 개인지 나타낸다.
d[i][j] = d[i - 1][j + 1] + d[i - 1][j - 1]
d[i][j]는 자리수가 1 작은 수들 중, 자리수 차이가 1이 나는 끝자리 수(+1,-1)들의 합과 같다. d[2][3] => 자리수가 1개인 수 중에서 끝자리가 2 또는 4에서 파생된다. ex) 2 와 4 => 23, 43
코드
max = 101
d = [[0] * 10 for _ in range(max)]
n = int(input())
d[1] = [0,1,1,1,1,1,1,1,1,1]
a = 1000000000
# d[i][j]는 i자리수에서 j라는 수로 끝나는 수의 개수를 의미.
# 끝자리가 0과 9일 때는 자리수 차이가 1이 가능한 것이 0은 앞자리가 1일때, 9는 앞자리가 8일때만 가능해서
# if 문으로 경우를 따로 나눈다.
for i in range(2, max):
for j in range(10):
if j != 0 and j != 9:
d[i][j] = d[i - 1][j + 1] + d[i - 1][j - 1]
else:
if j == 0:# 0으로 끝나는 자리 수 일때
d[i][j] = d[i - 1][j + 1]
else:# 9로 끝나는 자리 수 일 때
d[i][j] = d[i - 1][j - 1]
d[i][j] %= a
print(sum(d[n]) % a)
'Algorithm 문제 & 공부 > DP' 카테고리의 다른 글
백준 1699번 파이썬: 제곱수의 합 (0) | 2022.08.14 |
---|---|
백준 11053번 파이썬 (0) | 2022.08.11 |
백준 15590 파이썬 - 1, 2, 3 더하기-5 (0) | 2022.08.08 |
백준 11052번 카드 구매하기 - 파이썬 (0) | 2022.08.06 |
백준 11727번 2xn 타일링2 - 파이썬 (0) | 2022.08.04 |
Comments