티스토리 뷰

알고리즘 공부/백준

백준 1038번

_Yunhwan 2022. 10. 29. 22:17

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

 

1038번: 감소하는 수

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

www.acmicpc.net

N = int(input())

arr = []

cnt= 0 
number = 0 

# 수 찾기
def find_down(length, n):
  global arr

  #숫자길이가 같을 때 배열에 추가
  if len(n)==length:
    arr.append(int(n))
    return True

  #현재 숫자길이가 0일때
  if len(n)==0:
    # 맨 앞의 수가 감소하는 수가 될 수 있도록 설정
    for i in range(length-1,10):
      find_down(length,n+str(i))
  
  else:
    #감소하는 수가 될수 없는 경우
    if n[-1]==0: 
      return False
    #0부터 앞의 수보다 작은 수까지만 가능
    for i in range(int(n[-1])):
      find_down(length,n+str(i))

#N==0일때 예외처리
if N==0:
  print(0)


else:
  #감소하는 수가 가능한것은 1~9876543210
  for i in range(1,11):
    find_down(i,'')

  try:
    print(arr[N])
  #오류시 -1출력
  except:
    print(-1)

 

감소하는 수가 되는 경우는 1~9876543210

하지만 이를 전부 하나하나 찾으면 시간 초과 발생

 

따라서 수 찾기 함수를 사용하여 1부터 10자리 감소하는 수를 찾아줌

문자열을 이용해, 맨 뒤에 위치하는 수보다 작은 수를 추가 해주고

조건에 만족하지 않으면 False

 

배열의 길이가 원하는 자릿수만큼 커지면 감소하는 수 추가

# 수 찾기
def find_down(length, n):
  global arr

  #숫자길이가 같을 때 배열에 추가
  if len(n)==length:
    arr.append(int(n))
    return True

  #현재 숫자길이가 0일때
  if len(n)==0:
    # 맨 앞의 수가 감소하는 수가 될 수 있도록 설정
    for i in range(length-1,10):
      find_down(length,n+str(i))
  
  else:
    #감소하는 수가 될수 없는 경우
    if n[-1]==0: 
      return False
    #0부터 앞의 수보다 작은 수까지만 가능
    for i in range(int(n[-1])):
      find_down(length,n+str(i))

 

'알고리즘 공부 > 백준' 카테고리의 다른 글

백준 1931번  (0) 2022.10.29
백준 2293번  (0) 2022.10.29
백준 1016번  (0) 2022.10.29
백준 1456번  (0) 2022.10.29
백준 1189번  (0) 2022.10.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함