백준 1038 감소하는 수

김민영·2023년 1월 24일
0

알고리즘

목록 보기
97/125

과정

  • 백트래킹을 사용해서 감소하는 수를 만든다.
  • 수의 길이가 1인 경우는 따로 예외 처리를 했다.
  • N 번째 감소하는 수가 나올 때까지 백트래킹을 시행하고, 값이 나오지 않는 경우는 -1을 출력한다.
    • 자리마다 최소 1씩 감소해야하기 때문에 감소하는 수 중 제일 큰 수는 9876543210 이다. 이는 1022번째 수이며, 이 이상의 값이 N으로 들어오면 -1을 출력해야 한다.
N = int(input())

cnt = 9
def main(level, now):
    if level == target_len:
        
        global cnt
        cnt += 1
        if cnt == N: # 답이 들어오면 출력 후 종료
            print(now)
            exit()
        return
    
    for i in range(10):
        if level == 0 or int(now[-1]) > i:
            now = now + str(i)
            main(level + 1, now)
            now = now[:-1]

if N < 10: # 한 자리 수인 경우 예외처리
    print(N)
    exit()

i = 2
while True:
    target_len = i
    main(0, "")
    i += 1
    if cnt == 1022: # 값이 존재하지 않는 경우, -1 출력
        print(-1)
        break
  • exit를 사용하지 않고 효율적으로 계산할 수 있다면 더 좋은 코드가 될 것 같다.
profile
노션에 1차 정리합니당 - https://cream-efraasia-f3c.notion.site/4fb02c0dc82e48358e67c61b7ce8ab36?v=

0개의 댓글