본문 바로가기

알고리즘/백준

[백준 1038][파이썬] 감소하는 수

https://www.acmicpc.net/problem/1038

 

1038번: 감소하는 수

음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를

www.acmicpc.net

저번에 사용한 combinations를 사용했다. 

0부터 9까지 숫자(형식은 문자)를 중복 없이 i개를 뽑으면 '9'-'0'순으로 정렬된 tuple이 생긴다. 그러면 tuple안의 요소를 순서대로 문자열 형태로 더한 후에 num_list에 넣을 때만 정수형으로 바꿔주면 된다. 그런데 이렇게 되면 순서가 뒤죽박죽이라 마지막에 sort를 한 번 해줘야 한다. 

 

감소하는 수의 최대 개수는 미리 구할 수 있어서 N이 1023 이상이면 계산하지도 않고 -1을 출력하는 것이다.

 

from itertools import combinations
import sys

input = sys.stdin.readline

N = int(input())
num_list = []

def findDecreaseNum() :
  for i in range(1, 11):
    for combination in combinations(['9', '8', '7', '6', '5', '4', '3', '2', '1', '0'], i):
      num_list.append(int(''.join(combination)))

  num_list.sort()

if N >= 1023:
  print(-1)

else:
  findDecreaseNum()
  print(num_list[N])