[백준][6603번] 로또

Updated:

문제 URL

https://www.acmicpc.net/problem/6603 boj6603

나의 풀이 (재귀)

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int[] ans = new int[6];
    // input
    static int[] w = new int[13];

    public static void main(String[] args) throws IOException {
        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int size = Integer.parseInt(st.nextToken());
            if (size == 0) {
                return;
            }
            for (int i = 0; i < size; i++) {
                w[i] = Integer.parseInt(st.nextToken());
            }
            cal(0, 0, size, 6);
            bw.newLine();
            bw.flush();
        }
    }
    /*
    idx : 탐색중인 인덱스
    selected : 선택된 개수
    n: idx의 전체 size
    m: 조합을 만들고자 하는 개수
    */
    public static void cal(int idx, int selected, int n, int m) throws IOException {
        if (selected == m) {
            StringBuilder sb =new StringBuilder();
            for(int i=0; i<6; i++){
                sb.append(w[ans[i]]+" ");
            }
            bw.write(sb.toString());
            bw.newLine();
            return;
        }

        if (idx >= n)
            return;

        ans[selected] = idx;
        cal(idx+1, selected+1, n, m);
        ans[selected] = 0;
        cal(idx+1, selected, n, m);
    }
}

다른 풀이 (순열)

순열을 이용한 풀이방식이다. 이 문제는 전에 풀었던 순열문제와 다르게 순서가 중요하지않는 조합문제다. 하지만 다르게 생각해서 순열을 이용해서 풀수있다.


전체를 k라고 하자 고르는것을 1이라하면 6개를 고르면되고 안고름을 0이라고하면 k-6개을 고르면된다.

다시말해, 0을 k-6개, 1을 6개 넣은 다음에 next_permutation(다음수열 함수)를 수행하면 조합 모든 조합을 구할수있다.

import java.util.*;
public class Main {
    static boolean next_permutgetion(int[] a) {
        int i = a.length-1;
        while (i > 0 && a[i-1] >= a[i]) {
            i -= 1;
        }

        if (i <= 0) {
            return false;
        }

        int j = a.length-1;
        while (a[j] <= a[i-1]) {
            j -= 1;
        }

        int temp = a[i-1];
        a[i-1] = a[j];
        a[j] = temp;

        j = a.length-1;
        while (i < j) {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            i += 1;
            j -= 1;
        }
        return true;
    }
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            int n = sc.nextInt();
            if (n == 0) break;
            int[] a = new int[n];
            for (int i=0; i<n; i++) {
                a[i] = sc.nextInt();
            }
            int[] d = new int[n];
            for (int i=0; i<n; i++) {
                if (i < n-6) d[i] = 0;
                else d[i] = 1;
            }
            ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
            do {
                ArrayList<Integer> cur = new ArrayList<>();
                for (int i=0; i<n; i++) {
                    if (d[i] == 1) {
                        cur.add(a[i]);
                    }
                }
                ans.add(cur);
            } while (next_permutgetion(d));
            Collections.sort(ans, new Comparator<ArrayList<Integer>>() {
                public int compare(ArrayList<Integer> l1, ArrayList<Integer> l2) {
                    int n = l1.size();
                    int m = l2.size();
                    int i = 0;
                    while (i < n && i < m) {
                        int t1 = l1.get(i);
                        int t2 = l2.get(i);
                        if (t1 < t2) return -1;
                        else if (t1 > t2) return 1;
                        i += 1;
                    }
                    if (i == n && i != m) return -1;
                    else if (i != n && i == m) return 1;
                    return 0;
                }
            });
            for (ArrayList<Integer> v : ans) {
                for (int x : v) {
                    System.out.print(x + " ");
                }
                System.out.println();
            }
            System.out.println();
        }
    }
}

Leave a comment