*문제 출처는 백준에 있습니다.
문제 제목: 10844번 쉬운 계단 수
문제 사이트: https://www.acmicpc.net/problem/10844
1 초 | 256 MB | 126406 | 40201 | 29096 | 30.082% |
문제
45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
예제 입력 1 복사
1
예제 출력 1 복사
9
예제 입력 2 복사
2
예제 출력 2 복사
17
출처
- 문제를 만든 사람: baekjoon
알고리즘 분류
첫풀이
1차원적으로 다이나믹 프로그래밍을 접근했다.
뭔가 규칙을 찾을 수 있을 거같았음!
일단 문제에서 조건은
# 길이가 n인 계단수 출력
# 0은 아님
일단 규칙을 확인해보기 위해 규칙을 정립 해보았음
0:[1],1:[0,2],2:[1,3],3:[2,4],4:[3,5],5:[4,6], 6:[5,7], 7:[6,8], 8:[7,9], 9:[8]
모든 수의 계단 수를 입력했는데, 1의 자리일때 0은 포함하지 않으므로 n = 1일 때 1을 빼줘야한다.
그리고 2의 자리일때 해당 계단 수를 이용해야하는데 ,난 이렇게 하면 풀릴 줄 알았음 ..^^
def solution(n):
stair = {0:[1],1:[0,2],2:[1,3],3:[2,4],4:[3,5],5:[4,6], 6:[5,7], 7:[6,8], 8:[7,9], 9:[8]}
dp= [0] * (n+1)
if n == 1: return 9
elif n == 2: return 17
else:
dp[1] = len(stair) - 1 # 0은 제외
dp[2] = (len(stair) - 2) + 1
for i in range(3,n+1):
dp[i] = dp[i-1] * (len(stair) -1 )
return dp[n] % 1000000000
if __name__ == "__main__":
n = int(input())
print(solution(n))
결국 2차원으로 dp 를 이용한다는 것을 알게 되었고
각 10개의 열을 가진 리스트를 생성하여 N의 최대값 ( 101 ) 만큼 행을 만든다.
그리고 0번째 행부터 0의자리, 1번째 행부터 1의자리.. 이런 것처럼 각 행은 자릿수를 의미하게한다.
0번째 행에서는 0인경우는 제외해야하니 조심해서 구현하자! (문제 조건)
dp= [[0 for i in range(10) ] for i in range(101)]
for i in range(10):
if i != 0:
dp[0][i] += 1
그리고 수를 조합할 때 볼 수 있듯이,
끝자리가 0인 경우에는 계단수가 1,
9인 경우에는 계단 수가 8 ,
이 둘을 제외한 모든 경우는 앞뒤 두개씩 수가 존재함을 알 수 있다.
따라서 해당 규칙을 코드로 다음과 같이 나타낸다.
for i in range(1,101):
for j in range(10):
if j == 0 :
dp[i][j] = dp[i-1][j+1]
elif j == 9:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
최종 풀이
def solution(n):
dp= [[0 for i in range(10) ] for i in range(101)]
for i in range(10):
if i != 0:
dp[0][i] += 1
for i in range(1,101):
for j in range(10):
if j == 0 :
dp[i][j] = dp[i-1][j+1]
elif j == 9:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
return sum(dp[n]) % 1000000000
if __name__ == "__main__":
n = int(input())
print(solution(n-1))
※ 알아야 할 것
- 자릿수를 생각해서 2차원 dp 로 문제를 푼다.
'coding test - python > 백준' 카테고리의 다른 글
백준 / 1107번 리모컨 / Python 파이썬 (0) | 2023.05.16 |
---|---|
백준 / 17219번 비밀번호 찾기 / Python 파이썬 (0) | 2023.05.15 |
백준 / 1068번 트리 -dfs / Python 파이썬 (0) | 2023.05.09 |
백준 / 9184번 신나는 함수 실행 - dp / Python 파이썬 (0) | 2023.05.09 |
백준 / 24416번 알고리즘 수업 - 피보나치 수 1 (dp) / Python 파이썬 (0) | 2023.05.02 |