백준풀이-python

1038 감소하는 수

Fug 2021. 8. 20. 14:57

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

#부분 집합

#백 트래킹

 

1038번: 감소하는 수

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

www.acmicpc.net

#답지

import sys

sys.setrecursionlimit(10 ** 9)


def solve(n):

cnt = 0
#cnt가 n이 되면 종료
num = 1
#말그대로 넘버 n번째 감소하는 수
while True:

str_num = str(num)
#num을 str화
flag = True
#flag True
if len(str_num) == 1: # 길이가 1이면 무조건 감소하는 수

pass
#num이 일의 자리 수면 패스


else:

for i in range(1, len(str_num)):
#최대자리수 빼고 돌림


if int(str_num[i]) < int(str_num[i - 1]):
#만약 감소하는 수면 continue


continue

else:
# 7654432 면 i는 4이다.
#7655032 이런식인듯

#i가 감소하는 수가 아니라면


start = str_num[:i - 1]
#start= i값에서 -2 뺀거까지의 값


mid = str(int(str_num[i - 1]) + 1)
#mid=i값에서 -1뺀거의 값에서 1 더함


end = '0' + str_num[i + 1:]
#'0' 더하기 i+1부터의 값


num = int(start + mid + end)
# 다 합침


flag = False

# 찾지 못하면 False

 

break

 

if flag:

cnt += 1

if cnt == n: # n번째 감소하는 수

 

return num

num += 1

#찾으면 cnt세주고 값을 1올림으로써 다음 감소하는 수 찾기

 

 

 

if __name__ == "__main__":

n = int(sys.stdin.readline())

if n >= 1023: # 1022: 9876543210

print(-1) # N번째 감소하는 수 x

elif n == 0:

print(0)

else:

print(solve(n))

 

#아이디어

 

부분집합으로 취급해서 9876543210 을 넣냐 안 넣냐로 코드를 짜는 것이다.

 

그럼 2^10 총 1024 가지 인데 여기서 0번째 와 아무것도 사용하지 않는 경우의 수 제외

 

n번째 수만 찾으면 되는것이다. 백트래킹을 이용해서 구해준다. 흥미로운건 n번쨰 수인지 판별할때

 

flag를 사용했다는 것과 str과 int를 넘나들면서 구헀다는 것이다.