Algorithm/Brute Force

(Python) - BOJ(1038번) : 감소하는 수

하눤석 2022. 1. 25. 11:14
728x90

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

 

1038번: 감소하는 수

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

www.acmicpc.net

 

  • 해설 :

음이 아닌 정수 X가 가장 큰 자릿수부터 가장 작은 자릿수까지 감소한다면 (숫자가 작아진다면) 이는 감소하는 수 이다.

N이 주어질 때 0부터 시작하는 감소하는 수들 중 N번째 수를 출력하는 문제이다 (숫자는 1,000,000) 이하이다.

 

 

 

 

  • 풀이 :

완전 탐색 문제이다.

N번째 수인지 확인하는 cnt 변수를 두고, 이 cnt 변수가 N보다 작은동안 1부터 1,000,000까지 모든 수들에 대해 감소하는 수인지 확인한다. 이 때, 1022번째부터는 값의 범위가 1,000,000을 넘어가므로 이전값까지 확인하면 된다.

감소하는 수인지 확인할 땐, 각 자릿수별로 잘라서 이전 값과 비교하는 방법을 사용했다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
input = sys.stdin.readline
 
def findpath(N):
    num = 1
    cnt = 0
    if N >= 1023:
        return -1
    if N == 0:
        return cnt
    while True:
        length = str(num)
        f = True
        if len(length) == 1:
            pass
        else:
 
            for i in range(1,len(length)):
                if int(length[i]) < int(length[i-1]): # 감소하는 수 인지
                    continue
                else:
                    start = length[:i - 1]
                    mid = str(int(length[i - 1]) + 1)
                    end = '0' + length[i + 1:]
                    num = int(start + mid + end)
                    f = False
                    break
        if f:
            cnt +=1
            if cnt == N:
                return num
            num += 1
 
if __name__ == "__main__":
    N = int(input())
    print(findpath(N))
cs
320x100