본문 바로가기
Algorithm/Baekjoon

11057_오르막수

by 모너아링 2025. 2. 24.

▶ 실버 1 (DP)

풀이

규칙이 있을거라고 생각하고 작은 자리수만 적어보았습니다.

# 1 -> 0 1 2 3 4 5 6 7 8 9
# 2 -> 00 / 01 11 / 02 12 22 / 03 13 23 33 / 04 14 24 34 44 / ...
# 3 -> 000 / 001 011 111 / 002 012 112 022 122 222 /
# 4 -> 0000 / 0001 0011 0111 1111
# dp[자리수][끝자리] = dp[자리수][끝자리 - 1] + dp[자리수 - 1][끝자리]

 

적다보니 점화식이 보여서 DP임을 깨달았습니다.

이중 for문을 돌려 (시간 복잡도: O(N), 자리수가 0 ~ 9이므로.)

dp 배열을 채워줍니다.

해당 자리수의 가장 끝자리가 모두 그 전 자리 값들이 누적된 수이므로 답은 dp[N][9]

 

주의 사항

1. 예외처리를 제대로 해줘야합니다.

→ 끝자리가 0인 경우 무조건 0

2. 처음에 착각해서 2차원 배열 초기값으로 [0, 1, 2, ~~, 9] 를 넣었는데, 다시 생각해보니 개수를 넣어줘야 하기 때문에 [1 * 9] 로 넣는 것이 맞습니다.

 

코드

# 11057 오르막수

import sys
input = sys.stdin.readline

n = int(input())

dp = [[1 for _ in range(10)] for _ in range(n)]

for i in range(n):
    for j in range(10):
        if j == 0:
            dp[i][j] = 1
            continue
        dp[i][j] = dp[i][j - 1] + dp[i - 1][j]

print(dp[n - 1][9] % 10007)
 

'Algorithm > Baekjoon' 카테고리의 다른 글

5014_스타트링크  (0) 2025.02.25
16935_배열 돌리기3  (2) 2025.02.24
16948_데스 나이트  (0) 2024.02.19
3584_가장 가까운 공통 조상  (0) 2023.08.07
1967_트리의 지름  (0) 2023.08.05