[BOJ] 10844번 쉬운 계단 수 - 파이썬
📒 문제
45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
✏️ 풀이
처음에는 문제 이해를 잘못해서 식을 어떻게 그려봐야하나 한참 고민했다.
역시 나는 문제를 잘읽는 습관을 들이도록 노력해야한다.
이 문제는 숫자들이 각 자리가 각각 1씩만 차이나도록 해야하기 때문에, 0부터 9까지 9개의 경우를 나누어 입력하는 N이 증가하는 경우에 따라 표(?)를 그려보면 규칙을 찾을 수 있었다.
0 1 2 3 4 5 6 7 8 9
N = 1) 0 1 1 1 1 1 1 1 1 1
N = 2) 1 1 2 2 2 2 2 2 2 1
N = 3) 1 3 3 4 4 4 4 4 3 2
이런 식으로 숫자들이 이어지는 것을 알 수 있는데, 이를 자세히 살펴보면 N = 2인 부분부터 각각의 숫자들은 바로 위 숫자들 중, 자기 자신의 왼쪽과 오른쪽 대각에 있는 숫자의 합임을 알 수 있다.
또한 0이나 9는 각각 오른쪽, 왼쪽의 대각의 숫자와 같음을 알 수 있다.
이를 이용하여 코드를 작성해보았다.
import copy
n = int(input())
dp = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
if n == 1:
print(9)
else:
for j in range(1, n):
dp_copied = copy.deepcopy(dp)
for i in range(10):
if i == 0:
dp[i] = dp_copied[1]
elif i == 9:
dp[i] = dp_copied[8]
else:
dp[i] = dp_copied[i-1] + dp_copied[i+1]
print(sum(dp)%1000000000)
바로 위의 대각에 있는 숫자들을 가져오기 위해 copy 모듈을 import하여 deepcopy를 이용했다.
메모리는 29756kb, 시간은 88ms로 나름 적당한 결과를 얻을 수 있었다.
Author And Source
이 문제에 관하여([BOJ] 10844번 쉬운 계단 수 - 파이썬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoonkeem/BOJ-10844번-쉬운-계단-수-파이썬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)