백준 1038번 [감소하는 수 | 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)
Author And Source
이 문제에 관하여(백준 1038번 [감소하는 수 | python]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shi3do/백준-1038번-감소하는-수-python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)