-
boj)6603 - 로또PS/boj 2020. 12. 1. 11:16123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103import java.io.*;import java.util.*;public class boj_6603 {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));static StringTokenizer st;static int k;static int[] numbers;static String str;static List<List<Integer>> list;public static void main(String[] args) throws IOException {while ( !(str = br.readLine()).equals("0") ) {st = new StringTokenizer(str);k = Integer.parseInt(st.nextToken());numbers = new int[k];for (int i = 0; i < k; i++) {numbers[i] = Integer.parseInt(st.nextToken());}solve();print();}bw.flush();bw.close();}static void solve() {int[] orders = new int[k];for (int i = 0; i < k; i++) {if (i < k-6) orders[i] = 0;else orders[i] = 1;}list = new ArrayList<>();do {List<Integer> cur = new ArrayList<>();for (int i = 0; i < k; i++) {if (orders[i] == 1) {cur.add(numbers[i]);}}list.add(cur);} while (next_permutation(orders, k));reverseList();}static void print() throws IOException {for (List<Integer> l : list) {for (Integer v : l) {bw.write(v + " ");}bw.newLine();}bw.newLine();}static void reverseList() {list.sort(new Comparator<List<Integer>>() {@Overridepublic int compare(List<Integer> o1, List<Integer> o2) {int n = o1.size();int m = o2.size();int i = 0;while (i < n && i < m) {int t1 = o1.get(i);int t2 = o2.get(i);if (t1 < t2) return -1;else if (t1 > t2) return 1;i++;}if (i == n && i != m) return -1;else if (i != n && i == m) return 1;return 0;}});}static boolean next_permutation(int[] a, int n) {int i = n-1;while (i > 0 && a[i-1] >= a[i]) i-=1;if (i <= 0) return false;int j = n-1;while (a[j] <= a[i-1]) j-=1;int temp = a[i-1];a[i-1] = a[j];a[j] = temp;j = n-1;while (i < j) {temp = a[i];a[i] = a[j];a[j] = temp;i += 1; j -= 1;}return true;}}
cs - 순열, 조합, 백트래킹
- 순열로 접근해서 풀어봤는데 출력이 뒤집혀 있어서 list를 다시 뒤집어줘야 하는데 과정이 복잡하고 불편하다.
- 백트래킹으로 접근하여 6자리 만들어놓고 넣어가는 식으로 푸는 게 더 편리할 것 같다.
- orders 에 0과 1을 사용하여 모든 순열을 만들고 그 순열에 맞게 (1 : 사용, 0 : 미사용)으로 list에 추가시켜준다.
- 이렇게 하면 근데 ex) k = 7 일 경우 0111111 부터라 사전 반대 순으로 출력된다.
- 결국 전체 list 를 다시 뒤집어줘야 한다. reverseList
'PS > boj' 카테고리의 다른 글
boj)14501 - 퇴사 (0) 2020.12.02 boj)1759 - 암호 만들기 (0) 2020.12.01 boj)10971 - 외판원 순회 2 (0) 2020.11.30 boj)10819 - 차이를 최대로 (0) 2020.11.30 boj)10974 - 모든 순열 (0) 2020.11.30