diff --git a/workbook_7319/silver/11057-s1.py b/workbook_7319/silver/11057-s1.py new file mode 100644 index 0000000..8d9d9d0 --- /dev/null +++ b/workbook_7319/silver/11057-s1.py @@ -0,0 +1,43 @@ +# 오르막 수 + +import sys + +input = sys.stdin.readline + +def solution(): + n = int(input().rstrip()) + + dp = [1]*10 + + for _ in range(1, n): + temp = dp[-1] + dp[-1] = sum(dp) + for i in range(8, -1, -1): + temp2 = dp[i] + dp[i] = dp[i+1] - temp + temp = temp2 + + print(sum(dp)%10007) + + return + + +solution() + +""" +걸린 시간: 50분 + +시간 복잡도: 10자리의 dp 테이블을 n번만큼 반복하며 업데이트하기 때문에 O(10n)이다. + +해설: 한 자리수 일때는 0~9까지 그냥 10개이다. +두 자리수 일때는 0일때 0~9, 1일때 1~9 ... 로 10개부터 1개까지 다 더한 55개이다. +세 자리수 일때는 0--일때, 55개, 1--일때, 11부터 99까지이므로 1~9 ... 1~1까지 45개이므로, 두 자리수 기준으로 0~9일때, 1~9일때.. 경우의 수를 가져온다. +그렇다는것은 자리수가 늘어날수록 10개의 수 기준으로 합이 정답이 된다는 뜻이다. +따라서 dp = [1]*10으로 해놓고, 자리수가 늘어날수록 합을 계속 계산하면 된다. +나는 논리 그대로 55에서 10을 빼고, 45에서 9를 빼고.. 순서로 가다보니 dp를 뒤에서부터 채우느라 temp가 2개 등장했지만, +사실 이게 앞에서부터 누적합을 계산하는 것이랑 똑같다. + +수식으로 이해해보자면, dp[i][j]를 i자리수의 끝 숫자가 j일때 경우의 수로 생각해보면, dp[i][j] = dp[i-1][0] + dp[i-1][1] + .. + dp[i-1][j]이다. +이건 결국 전 행의 누적합을 의미한다. 또한 dp[i][j-1] = dp[i][0] + .. + dp[i][j-1]이므로, dp[i][j] = dp[i][j-1] + dp[i-1][j]가 된다. +따라서 1차원으로 만들면 dp[i] = dp[i-1] + dp[i](이전)이 된다. +""" \ No newline at end of file