# 조합을 이용한 코드
from itertools import combinations
import sys
input = sys.stdin.readline
def BOJ1038() :
N = int(input())
answers = []
for i in range(1, 11) :
for comb in combinations(range(0, 10), i) :
comb = list(comb)
comb.sort(reverse=True)
answers.append(int("".join(map(str, comb))))
answers.sort()
try :
print(answers[N])
except :
print(-1)
BOJ1038()
# https://ryu-e.tistory.com/59
# 재귀를 이용한 코드
import sys
input = sys.stdin.readline
def BOJ1038() :
N = int(input())
answers = []
def get_decrease(num) :
answers.append(num)
peak = int(str(num)[0])
for i in range(peak + 1, 10) :
get_decrease(int(str(i) + str(num)))
for i in range(10) :
get_decrease(i)
answers.sort()
try :
print(answers[N])
except :
print(-1)
BOJ1038()
다른 분의 코드를 참고했는데 신선했다.
풀이 접근 방법:
조합을 이용한 코드
1. 1자리 부터 10자리 까지 0~9 까지 숫자의 조합을 구한다.
2. 순열이 아니라 조합이므로 중복되는 숫자는 등장하지 않는다.
3. 추출된 숫자를 거꾸로 정렬한다. 이후에 정답 배열에 넣어주면 끝이다.
재귀를 이용한 코드
1. 0부터 9까지 탐색을 한다.
2. 재귀함수를 선언하고 재귀함수 내부에서 들어온 숫자의 맨 처음 값 (20 => 2) + 1부터 10까지 탐색한다.
3. 입력받은 숫자보다 항상 커야 하므로 str(i) + str(num) 형태로 계속 재귀를 호출해준다.
https://www.acmicpc.net/problem/1038
1038번: 감소하는 수
음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
이모티콘 [백준 14226] - python (0) | 2022.04.23 |
---|---|
멀티탭 스케줄링 [백준 1700] - python (0) | 2022.04.11 |
사탕 게임 [백준 3085] - python (1) | 2022.04.08 |
최소비용 구하기 [백준 1916] - python (0) | 2022.04.03 |
동전 2 [백준 2294] - python (0) | 2022.04.02 |