Unborn 8.0 Yellow Pointer
본문 바로가기
프로그래밍/Python

[백준/11057] 오르막 수 - 파이썬(Python)

by 에삐니 2022. 3. 23.
728x90

문제

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.

예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.

입력

첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.

문제 풀이

오르막 수는 1의 자리부터 n의 자리까지 수가 오름차순으로 되어있어야 한다. 1의 자리 숫자와 n자리 숫자와의 관계에 대해서 생각해보면 규칙을 알 수 있을 것 같다.

n\1의 자리 수 0 1 2 3 4
1 1 1 1 1 1
2 1 2
(01, 11)
3
(02, 12, 22)
4
(03, 13, 23, 33)
5
(04, 14, 24, 34, 44)
3 1 3
(001
, 011, 111)
6
(002
, 012, 022
, 112, 122, 222)
10
(003
, 013, 113
, 023, 123, 223
, 033, 133, 233, 333) 
15
(004
, 014, 114
, 024, 124, 224
, 034, 134, 234, 334
, 044, 144, 244, 344
, 444)

예를 들어, 1의 자릿수가 3인 경우, 

  • n이 1일 경우, 1
  • n이 2일 경우, 2의 2의 자리의 수(n) + 3의 1의 자리의 수(n-1)
  • n이 3일 경우, 2의 3의 자리의 수(n) + 3의 2의 자리의 수(n-1)

즉, dp[n] = dp[n] + dp[n-1]

코드

import sys
input = sys.stdin.readline

n = int(input())
dp = [1] * 10
for _ in range(1, n) :
    for i in range(1, 10) :
        dp[i] += dp[i-1]

print(sum(dp)%10007)
  • dp를 0 - 9의 1의 자리 수라고 생각하고 1로 초기화한다.
  • 이후 1의 자리가 0인 경우를 제외하고 2의 자리부터 계산하게 된다.
  • 예로 n = 2, dp[2] = dp[2] + dp[1]이 된다 => dp[2] : 1(2의 1의 자릿값) + dp[1] : 2(1의 2의 자릿값)

 

규칙만 찾으면 문제는 쉽게 풀 수 있었던 것 같다 !

 

728x90
반응형

댓글