웹찢남

[백준 11057 오르막 수 문제] PYTHON 본문

백준 Algorithm

[백준 11057 오르막 수 문제] PYTHON

harry595 2021. 7. 12. 19:09

이 문제는 먼저 규칙을 파악해야 한다.

 

N=2 일 때

00 11 ~
01 12
02 13
03 14
04 ~
~  19
09 
SUM: 10+9+8+7 ~ +1 = 55

 

N=3 일 때
000  111
001  112
002  113
003  114
004  115
005  116
~     ~
099  199
SUM: 55+45+36+28+21+15+10+6+3+1 = 220

 

맨 앞자리에 들어올 수 있는 숫자는 0부터 9까지 총 10개이다.

맨 앞자리에 들어오는 수를 기준으로 가질 수 있는 숫자의 갯수를 배열로 표현하면

N=2일때 [10,9,8,~,1]이다.

여기서 규칙을 볼 수 있는데

N=3의 0번째 index는 55로 N-1인 N=2의 SUM과 동일하다.

N=3의 1번째 index는 45로 N=2의 SUM 빼기 N=2의 0번째 index이다.

이것을 바탕으로 코드를 구현하면 아래와 같은 코드가 나온다.

(다른 블로그에 점화식을 사용한 코드가 있으니 참조)

 

N = int(input())
dp=[1,1,1,1,1,1,1,1,1,1]
tmpdp=[0,0,0,0,0,0,0,0,0,0]
if(N==1):
    print(10)
else:
    for i in range(N-1):
        sumdp=sum(dp)
        tmpdp[0]=sumdp
        tmpdp[1]=tmpdp[0]-dp[0]
        tmpdp[2]=tmpdp[1]-dp[1]
        tmpdp[3]=tmpdp[2]-dp[2]
        tmpdp[4]=tmpdp[3]-dp[3]
        tmpdp[5]=tmpdp[4]-dp[4]
        tmpdp[6]=tmpdp[5]-dp[5]
        tmpdp[7]=tmpdp[6]-dp[6]
        tmpdp[8]=tmpdp[7]-dp[7]
        tmpdp[9]=tmpdp[8]-dp[8]
        dp=tmpdp.copy()
    print(sum(dp)%10007)
Comments