BOJ 15654: N과 M (5) https://www.acmicpc.net/problem/15654
arr
을 오름차순으로 정렬한 뒤 dfs 함수를 실행한다.arr
배열의 startIdx
와 depth
를 인자로 전달한다.isVisited
에 방문 처리인 true
를 해주고 dfs 재귀 호출을 한 뒤 다시 false
처리를 해준다.printArr
에 depth
값을 인덱스로 하여 arr[i]
을 넣어준다.startIdx
에 i + 1
을 넣어주고 depth
값에 depth + 1
을 해준다.import java.util.*;
import java.io.*;
public class Main {
static int N, M;
static int[] arr;
static int[] printArr;
static boolean[] isVisited;
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
arr = new int[N]; // 입력받은 배열
printArr = new int[N]; // 출력할 배열
isVisited = new boolean[N];
for(int i=0; i<N; i++) {
arr[i] = sc.nextInt();
}
sc.close();
Arrays.sort(arr); // 오름차순으로 정렬했다.
dfs(0, 0);
}
static void dfs(int startIdx, int depth) {
if(depth == M) {
for(int i=0; i<M; i++) {
System.out.print(printArr[i]+" ");
}
System.out.println();
return;
}
for(int i=0; i<N; i++) {
if(!isVisited[i]) {
isVisited[i] = true; // 자기 자신은 빼고 배열에 담아야 함으로 boolean 배열을 추가해줬다.
printArr[depth] = arr[i];
dfs(i + 1, depth + 1);
isVisited[i] = false;
}
}
}
}