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 65 66 67 68 69 70 71 72 73 74 75 76 77 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.StringTokenizer; public class Main{ private static int[] arr; private static LinkedHashSet<String> hs; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); hs = new LinkedHashSet<String>(); 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); for(String s : hs) { sb.append(s.substring(0, s.length()-1)).append("\n"); } System.out.print(sb.toString()); } public static void backtrack(int[] a, int k, int r) { int[] c = new int[a.length]; // 후보군을 담는 배열 if (k == r) { print(a, k); } 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) { String s = ""; for (int i = 0; i < r; i++) { s=s + arr[a[i]] + " "; } hs.add(s); } } | cs |
중복때문에 LinkedHashSet 사용 순서 허용 O 중복 허용 X
'Algorithm 문제풀이' 카테고리의 다른 글
JUNGOL 배낭채우기1 (1) | 2019.03.26 |
---|---|
JUNGOL 119구급대 (0) | 2019.03.26 |
백준 N과M(8) (0) | 2019.03.21 |
백준 N과M(7) (0) | 2019.03.21 |
백준 N과M(6) (0) | 2019.03.21 |