
처음에는 브루트포스, dp 등 다양한 방법으로 시도해보았으나 시간초과가 발생해 포기하고 있던 문제였다. 그러다 FIFO 구조인 queue를 사용하는 방법이 떠올라 아래와 같이 문제를 풀어냈다.
import java.util.*;
public class Main {
static Scanner scan = new Scanner(System.in);
static int n;
static Queue<Long> q = new LinkedList<>();
public static void input() {
n = scan.nextInt();
for (int i = 0; i <= 9; i++) {
q.add((long) i);
}
}
public static void solve() {
if (n <= 10) {
System.out.println(n);
return;
}
int i = 10;
while (true) {
q.remove();
if(q.isEmpty()){
System.out.println(-1);
return;
}
long next = 0;
for (int j = 0; j < q.peek() % 10; j++) {
next = (long) q.peek() * 10 + j;
// System.out.println(q);
if (i++ >= n) { // 시도 횟수가 n과 같아지면 다음 감소하는 수(next)를 출력
System.out.println(next);
return;
}
if (next % 10 != 0) // 끝자리가 0인 경우 해당 수를 활용한 감소하는 수는 없으므로 push 하지 않음
q.add(next);
}
}
}
public static void main(String[] args) {
input();
solve();
}
}
완전탐색 사용 시 시간초과가 발생하고, n번째까지 감소하는 수의 갯수를 구하는 문제가 아니라 n번째 감소하는 수를 구하는 문제였기에 dp를 사용하다 풀이에 실패했다.
queue를 사용하는 방법과 같이 열린 생각으로 다양한 접근법을 애써 고민해보려 하는 것이 중요한 것 같다.
