본문 바로가기

Algorithm/BOJ

[BOJ] 1038. 감소하는 수

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

 

1038번: 감소하는 수

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

www.acmicpc.net

 

 

1. 해결방법

이 문제는 완전 탐색 백트래킹으로 해결한 문제이다.
( + 조합으로도 해결 )

처음엔 ''문자열을 시작으로 0부터 9까지의 값을 문자열에 더하면서 answer 리스트에 append 하였다.
재귀를 통해서 계속해서 문자열을 추가시켜 sort() 정렬을 해주면 감소하는 수의 리스트가 만들어진다.

 

 

2. 정답코드

(1) 백트래킹

import sys
input = sys.stdin.readline

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


def dfs(number):
    if len(number) == 0:
        for i in range(10):
            answer.append(int(i))
            dfs(number + str(i))

    else:
        for i in range(10):
            if int(number[-1]) > i:
                answer.append(int(number + str(i)))
                dfs(number + str(i))


dfs('')
answer.sort()

print(answer[N] if len(answer) > N else -1)

 

(2) 조합

import sys
from itertools import combinations
input = sys.stdin.readline

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


# 순열
for i in range(1, 11):
    for j in combinations(range(10), i):
        numbers = sorted(list(j), reverse=True)
        answer.append(int(''.join(map(str, numbers))))

answer.sort()
print(answer[N] if len(answer) > N else -1)

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 15684. 사다리 조작  (0) 2022.10.13
[BOJ] 1062. 가르침  (0) 2022.10.13
[BOJ] 2580. 스도쿠  (0) 2022.10.08
[BOJ] 1987. 알파벳  (6) 2022.10.07
[BOJ] 2529. 부등호  (1) 2022.10.06