ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)6603 - 로또
    PS/boj 2020. 12. 1. 11:16
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    import 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>>() {
                @Override
                public 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 <= 0return 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

     

     

     

     


    www.acmicpc.net/problem/6603

    '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
킹수빈닷컴