Algorithm 문제풀이
백준 N과M(5)
cjsong
2019. 3. 17. 20:23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main{ private static int[] arr; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); arr = new int[N]; int[] a = new int[N]; // 인덱스를 관리하는 배열 st = new StringTokenizer(br.readLine(), " "); for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(arr); backtrack(a, 0, M); } public static void backtrack(int[] a, int k, int r) { int[] c = new int[a.length]; // 후보군을 담는 배열 if (k == r) { print(a, r); } else { int cands = make_candidates(a, k, r, c); for (int i = 0; i < cands; i++) { a[k] = c[i]; backtrack(a, k + 1, r); } } } public static int make_candidates(int[] a, int k, int r, int[] c) { boolean[] flag = new boolean[a.length]; for (int i = 0; i < k; i++) { flag[a[i]] = true; } int cnt = 0; for (int i = 0; i < flag.length; i++) { if (!flag[i]) { c[cnt] = i; cnt++; } } return cnt; } public static void print(int[] a, int r) { for (int i = 0; i < r; i++) { System.out.print(arr[a[i]] + " "); } System.out.println(); } } | cs |