[백준 BOJ_1038] 감소하는 수 Python 풀이

출처: 백준 온라인 저지

문제

image

풀이

동적계획법으로 풀었습니다.

cache는 다음과 같습니다:

# cache[i][j] = 숫자 i로 시작하는 j+1 자릿수의 감소하는 숫자들의 배열
# i = 0
cache[0][0] = [0] # j = 0
# i = 1
cache[1][0] = [1] # j = 0
cache[1][1] = [10] # j = 1
# i = 2
cache[2][0] = [2] # j = 0
cache[2][1] = [20, 21] # j = 1
cache[2][2] = [210] # j = 2

다음 자릿수의 배열은 시작하는 숫자보다 작은 숫자로 시작하는 한 자릿수 적은 감소하는 수를 시작하는 숫자 뒤에 붙여주면 됩니다.

for s in range(start_num):
    num_lst.extend([start_num*(10**nth) + nums for nums in cache[s][nth-1]])

그렇게 해서 만들어진 num_lst를 result에 extend 해줍니다.
만약 result의 길이가 N보다 길 경우, 원하는 답을 찾았기 때문에 바로 break해줍니다.

혹시 다 찾아주어도 result의 길이가 N보다 짧을 때에는 N번째의 감소하는 수는 존재하지 않으므로
-1을 출력해주고, 그렇지 않을 때는 result[N]을 출력해줍니다.

코드

N = int(input())
cache = [[[] for _ in range(10) ] for _ in range(10)]
result = []
for i in range(10):
    cache[i][0].append(i)
    result.append(i)
for nth in range(1, 10):
    for start_num in range(10):
        num_lst = []
        for s in range(start_num):
            num_lst.extend([start_num*(10**nth) + nums for nums in cache[s][nth-1]])
        cache[start_num][nth] = num_lst
        result.extend(num_lst)
        if len(result) > N:
            break
    if len(result) > N:
        break
if N < len(result):
    print(result[N])
else:
    print(-1)

Leave a comment