
1) 먼저 입력받은 배열(arr)을 오름차순 정렬한다.
2) DFS에 start, cnt, visited 배열을 활용하여 조합 구하는 로직을 작성한다.
3) before 변수를 사용해 배열 내 이전 값과 현재 값이 중복인지 확인한다. 중복이면 지나간다. 이 과정이 없으면 위 예에서 result 값으로 [1 9], [7 9]가 중복으로 출력된다.
시간 복잡도 : O(2^N)
import java.io.*;
import java.util.*;
public class Main {
static int N,M;
static int[] arr;
static boolean[] visited;
static int[] result;
static StringBuilder sb = new StringBuilder();
public static void DFS(int start, int cnt, boolean[] visited){
if(cnt >= M){
for(int j=0; j<M; j++){
sb.append(result[j] +" ");
}
sb.append("\n");
return;
}
int before = -1;
for(int j=start; j<N; j++){
if(before==arr[j] || visited[j]==true){
continue;
}
else {
visited[j] = true;
result[cnt] = arr[j];
before = arr[j];
DFS(j + 1, cnt + 1, visited);
visited[j] = false;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N];
result = new int[M];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
visited = new boolean[N];
DFS(0,0, visited);
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}