본문 바로가기
알고리즘/백준

1038번 - 감소하는 수

by HWK 2024. 7. 18.

골드 5티어 감소하는 수라는 문제이다.

예를들어 987, 210은 감소하는 수이지만, 100, 200은 감소하는 수가 아니다.

N을 입력받고 N번째 감소하는 수를 구하는 문제이다.

 

문제를 보면 감소하는 수 중 가장 큰 수는 9,876,543,210이다.

크기가 정해져있고, 몇번 써보다보면 감소하는 수는 많지 않다는 느낌이 올 것이다.

즉, list에 감소하는 수를 모두 정리해주고, 그 list에서 해당 감소하는 수를 가져다가 쓰면 된다.

 

list를 만드는 방법은 어떤 수를 맨 앞에 올 수로 정하고, 그 뒤에는 그 수보다 작은 수만 넣어주면 될 것이다.

그리고 한번 정렬 해주고 N번째 요소를 빼주면 된다.

그렇게 나온 식은 다음과 같다.

import java.util.*;

public class Main {
    static int N;
    static ArrayList<Long> list;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        list = new ArrayList<>();
        if (N <= 10) {
            System.out.println(N);
        } else {
            for (int i = 0; i < 10; i++) {
                bp(i,1);
            }
            Collections.sort(list);
            if (N >= list.size()) {
                System.out.println(-1);
            } else {
                System.out.println(list.get(N));
            }
        }
    }
    static void bp(long num, int idx) {
        if (idx > 10) {
            return;
        }
        list.add(num);
        for (int i = 0; i < num % 10; i++) {
            bp((num * 10) + i, idx + 1);
        }
    }
}

bp의 for문을 보면 num % 10이 보이는데, 지금 만들어지고 있는 감소하는 수의 마지막 수를 구하는 것이다.

해당 수보다 작은 수만이 감소하는 수의 맨 마지막 숫자로 올 수 있다.

ex) 21 -> 0 <= 마지막 숫자 < 1
     10 -> 0 <= 마지막 숫자 < 0, 즉 for문이 종료되고 해당 과정은 더이상 실행되지 않음

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

1260번 - BFS와 DFS  (0) 2024.07.19
17070번 - 파이프 옮기기  (0) 2024.07.18
2667번 - 단지번호붙히기  (0) 2024.07.18
2293번, 2294번 - 동전1,2(규칙성 찾기)  (0) 2024.07.17
1789번, 3085번 - 브루트포스  (0) 2024.07.16