https://www.acmicpc.net/problem/1038
import java.io.*;
import java.util.*;
public class Main {
static int N;
static boolean[] visited;
static ArrayList<Long>list = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
visited = new boolean[10];
for (int i = 0; i < 10 ; i++) {
for (int j = 0; j <= 9; j++) {
rec_func(0, String.valueOf(j), i);
}
}
if (N >= list.size()) {
System.out.println(-1);
return;
}
System.out.println(list.get(N));
}
public static void rec_func(int k, String s, int limit )
{
if (k == limit) {
list.add(Long.parseLong(s));
}else{
for (int i = 0; i <= 9; i++) {
if(visited[i])continue;
if(s.charAt(k) > String.valueOf(i).charAt(0))
{
visited[i] = true;
rec_func(k + 1, s+String.valueOf(i), limit);
visited[i] = false;
}
}
}
}
}
rec_func 메서드:
재귀적으로 호출되며, 현재까지 생성된 숫자와 방문한 숫자를 기반으로 순열을 만든다. 메서드는 다음과 같은 매개변수를 가진다.
k: 현재까지 생성된 숫자의 개수를 나타내는 변수이다.
s: 현재까지 생성된 숫자를 문자열로 표현한 값이다.
limit: 순열의 길이를 나타내는 변수로, 목표 순열의 길이에 도달하면 순열을 리스트에 추가한다.
Main 메서드:
사용자로부터 N 값을 입력받는다.
0부터 9까지의 숫자에 대해 rec_func 메서드를 호출하여 순열을 생성한다. 이 과정은 중첩된 반복문을 통해 이루어진다.
생성된 순열이 list에 저장된다.
N이 list의 크기보다 큰 경우 -1을 출력하고 프로그램을 종료한다.
그렇지 않은 경우, N번째로 작은 순열을 출력한다.