백준 1038번 [감소하는 수 | python]

2021 단어 python백준python

문제

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

입력

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

출력

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

예제 입력 1

18

예제 출력 1

42

예제 입력 2

0

예제 출력 2

0

예제 입력 3

500000

예제 출력 3

-1

이렇게 푸는거 아닐텐데
수들 들어온거 섞어가면서 배열한 후 정렬해 감소하는 순서대로 푸는 것이 맞을 것이다.
근데, 브루트포스로 때려 맞췄다.

아무튼 설명을 해보자면, 자릿수를 세서 0번째자리부터 그 +1자리로 하나씩 옮겨가면서 만약에 어긋나는게 있다면 다음 자리로 올림하는 코드를 계속해서 돌리고, 이 코드를 돌면서 감소하는 수임이 판별난 수들 사이에 333였다면 340 400으로 올라가기 때문에 중간에 저 340 같은 수들을 빼낼 수 있도록 다시 한번 확인하는 코드를 만들었다. 조합대로면 9876543210으로 10자리니까 2^10 - 1 번째에서 9876543210이 나오게 될 거고 이 수가 감소하는 수 중에서는 가장 큰 수이므로, 1023부터는 -1을 출력하게 해놓았다.

import math


a = int(input())

i = 0
stop = 0
count = 0
while True:
  if a == 0:
    i=0
    break
  i= i+1
  if a > 1022:
    i=-1
    break
  else:
    length = len(str(i))
    k=0
    for j in range(0, length):
      if not str(i)[j:j+1] >= str(i)[j+1:j+2]:
        if i>10:
          i = math.ceil((i/10**(length-j-1)))*10**(length-j-1)
        break
        
    for j in range(0, length):
      if str(i)[j:j+1] > str(i)[j+1:j+2]:
        k+=1

    if k == length:
      count+=1
      #print("이게 i",i)
    if count == a:
      stop = 1

  if stop == 1:
    break

print(i)

좋은 웹페이지 즐겨찾기