이 문제는 순열(Permutation)을 구하는 문제로, 백트래킹을 사용하여 해결할 수 있다.
arr 배열: 현재 탐색 중인 수열을 담을 공간. 크기는 .visit 배열: 특정 숫자가 이미 수열에 포함되었는지 확인하는 용도. 크기는 .depth 변수: 현재까지 몇 개의 숫자를 선택했는지 나타낸다. (재귀의 깊이)depth가 0인 상태로 시작한다.visit[i]가 false라면 (아직 사용하지 않은 숫자라면):visit[i] = true)한다.arr[depth])에 숫자를 담는다.dfs(depth + 1))한다.visit[i] = false)한다.depth == M이 되면 수열이 완성된 것이므로, 결과를 출력 버퍼에 담고 리턴한다.System.out.print를 매번 호출하면 시간 초과가 발생할 수 있다.StringBuilder를 사용하여 출력할 문자열을 한 번에 모은 뒤, 마지막에 System.out.println으로 출력하여 성능을 높였다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] arr = new int[m];
boolean[] visit = new boolean[n+1];
dfs(n, m, 0, arr, visit);
System.out.println(sb.toString());
}
static void dfs(int n, int m, int depth, int[] arr, boolean[] visit) {
if(depth == m) {
for(int num : arr) {
sb.append(num + " ");
}
sb.append("\n");
return;
}
for(int i = 1; i <= n; i++) {
if(!visit[i]) {
arr[depth] = i;
visit[i] = true;
dfs(n, m, depth + 1, arr, visit);
visit[i] = false;
}
}
}
}