Skip to content

Latest commit

 

History

History
47 lines (37 loc) · 2.13 KB

풀이_1038.md

File metadata and controls

47 lines (37 loc) · 2.13 KB

🪅 백준 1038 (감소하는 수)

  • Date : 2021.04.11(일)
  • Time : 30분

문제

  • 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다.

입력

  • 첫째 줄에 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.

출력

  • 첫째 줄에 N번째 감소하는 수를 출력한다.

풀이

def check(N) :
    k = str(N)
    for i in range(0,len(k)-1):
        if k[i] <= k[i+1]:
            test = int(str(k[:i]) + str(int(k[i])+1)+ str(0) + str(k[i+2:]))
            return (False,test)
    return (True,N+1)

: 감소수인지 아닌지 판단해주는 함수를 하나 만들었다. 앞자리보다 뒷자리가 크거나 같다면 감소수가 아니라서 False를 리턴해주고 그 다음수까지 리턴해주었다. 만약 11에서 감소수가 아니라는 판단이 났다면 12~19는 모두 감소수가 아닐 것이다. 이것을 다 검사하면 시간초과가 났다. 그렇기 때문에 바로 20으로 넘어갈 수 있는 검사식을 만들어보았다. 만약 N = 433 이라면 index 1과 2에서 에러가 난다. 그렇다면 앞자리에는 +1을 해주고 뒷자리는 0으로 초기화 시켜주고 그 앞뒤는 다시 붙여준다. 그래서 440를 다음 수로 리턴해준다.

i = 0

while (len(answer) != (N+1)):
    if len(answer) == 1023 :
        break
    a,b = check(i)
    if a == True :
        answer.append(i)
    i = b

if len(answer) == (N+1) :
    print(answer[N])
else:
    print("-1")

: while 문에서는 모든 숫자를 다 검사할 때 까지 돌리고, 길이가 1023일 때 멈춘 이유는 N의 범위가 지정되어 있기 때문이다. 감소수가 맞다면 answer에 더해주고 아니라면 바로 다음 수로 넘어간다.