https://www.acmicpc.net/problem/15654
처음에는 되게 간단한 문제인줄 알았으나, dfs를 사용해야 하는 조금은 복잡한 문제였다. 우선, 깊이를 0으로 설정하여 dfs 함수를 호출한다. 이후 방문 처리를 해 주고, 깊이를 1씩 증가시켜 재귀를 통해 dfs함수를 호출시킨다. 깊이가 M과 같아지면 print를 해 주고, 방문 처리를 초기화하여 다음 순서로 넘어갈 수 있도록 구현해 주었다.
package silver3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class num15654 {
public static int N;
public static int M;
public static boolean[] visited; //방문 여부를 저장할 배열
public static int[] result; //순열을 저장할 배열
public static int[] inputArr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
N = Integer.parseInt(input[0]);
M = Integer.parseInt(input[1]);
String[] input2 = br.readLine().split(" ");
inputArr = new int[N];
visited = new boolean[N];
result = new int[M];
for (int i = 0; i < N; i++) {
inputArr[i] = Integer.parseInt(input2[i]);
}
Arrays.sort(inputArr); //오름차순 정렬
dfs(0);
br.close();
}
public static void dfs(int depth) {
if (depth == M) {
for (int i = 0; i < M; i++) {
System.out.print(result[i] + " ");
}
System.out.println();
return;
}
for (int i = 0; i < N; i++) {
if (!visited[i]) {
visited[i] = true;
result[depth] = inputArr[i];
dfs(depth + 1);
visited[i] = false;
}
}
}
}