Programming/백준

[골드 5] 백준 1038 - 감소하는 수 (파이썬)

pental 2025. 4. 16. 08:47

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

풀이

감소하는 수란 각 자릿수가 왼쪽부터 오른쪽으로 감소하는 수이다.

예를 들어서, 321, 740, 1 , 20 이런식을 의미한다.

0부터 9876543210 까지 총 1023개의 감소하는 수가 존재한 다는것을 알 수 있다.

입력 N이 주어졌을때, N번째 감소하는 수를 출력하는 문제이다.

  • 만약 존재하지 않으면 -1을 출력해야 한다.
for i in range(1, 11):
    for combination in combinations(list(range(10)), i):

combinations(range(10), i)는 0~9중 i개를 뽑는 조합을 구한다

예를 들어서 i 가 2라면 (0, 1), (0, 2), … , (8, 9)와 같은 모든 조합이 나온다.

이 조합들을 역순으로 정렬하여 자릿수가 감소하는 숫자들은 만드는 문제이다.

A.sort()
if len(A) <= N:
    print(-1)
else:
    print(A[N])

생성된 감소하는 수들을 오름차순 정렬하고, N번째 인덱스에 해당하는 값을 출력한다.

N이 감소하는 수 개수보다 크면 -1을 출력하는 문제이다.

코드

# 백준 1038 - 감소하는 수
# 분류 : 브루트 포스

from itertools import combinations

N = int(input())

A = []
for i in range(1, 11) :
    for combination in combinations(list(range(10)), i) :
        gamso = 0
        for n in combination[::-1] :
            gamso *= 10
            gamso += n
        
        A.append(gamso)

A.sort()
if len(A) <= N :
    print(-1)
else :
    print(A[N])