[백준][15663번] N과 M (9)

Updated:

문제 URL

https://www.acmicpc.net/problem/15663

첫번째 풀이

import java.util.*;
public class Main {
    static int[] a = new int[10];
    static int[] num = new int[10];
    static int[] cnt = new int[10];
    static void go(int index, int n, int m) {
        if (index == m) {
            for (int i=0; i<m; i++) {
                System.out.print(num[a[i]] + " ");
            }
            System.out.println();
            return;
        }
        for (int i=0; i<n; i++) {
            if (cnt[i] > 0) {
                cnt[i] -= 1;
                a[index] = i;
                go(index+1, n, m);
                cnt[i] += 1;
            }
        }
    }   
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] temp = new int[n];
        for (int i=0; i<n; i++) {
            temp[i] = sc.nextInt();
        }
        Arrays.sort(temp);
        int k = 0;
        int x = temp[0];
        int c = 1;
        for (int i=1; i<n; i++) {
            if (x == temp[i]) {
                c += 1;
            } else {
                num[k] = x;
                cnt[k] = c;
                k += 1;
                x = temp[i];
                c = 1;
            }
        }
        num[k] = x;
        cnt[k] = c;
        n = k+1;
        go(0, n, m);
    }
}

두번째 풀이

import java.util.*;
class Result implements Comparable<Result> {
    Integer[] a;
    Result(ArrayList<Integer> a) {
        this.a = a.toArray(new Integer[a.size()]);
    }
    int get(int index) {
        return (int)this.a[index];
    }
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Result) {
            Result that = (Result)obj;
            int n = this.a.length;
            for (int i=0; i<n; i++) {
                if (this.a[i] != that.a[i]) {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    }
    public int compareTo(Result that) {
        int n = this.a.length;
        for (int i=0; i<n; i++) {
            if (this.a[i] == that.a[i]) continue;
            if (this.a[i] < that.a[i]) return -1;
            if (this.a[i] > that.a[i]) return 1;
        }
        return 0;
    }
}
public class Main {
    static boolean[] c = new boolean[10];
    static int[] a = new int[10];
    static int[] num = new int[10];
    static ArrayList<Result> d = new ArrayList<>();
    static void go(int index, int n, int m) {
        if (index == m) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i=0; i<m; i++) {
                temp.add(num[a[i]]);
            }
            d.add(new Result(temp));
            return;
        }
        for (int i=0; i<n; i++) {
            if (c[i]) continue;
            c[i] = true;
            a[index] = i;
            go(index+1, n, m);
            c[i] = false;
        }
    }   
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i=0; i<n; i++) {
            num[i] = sc.nextInt();
        }
        Arrays.sort(num, 0, n);
        go(0, n, m);
        Collections.sort(d);
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<d.size(); i++) {
            if (i == 0 || !d.get(i).equals(d.get(i-1))) {
                for (int j=0; j<m; j++) {
                    sb.append(d.get(i).get(j));
                    if (j != m-1) sb.append(' ');
                }
                sb.append('\n');
            }
        }
        System.out.print(sb);
    }
}

느낀점

N개의 자연수 중에서 M개를 고른 수열을 모두 구하는 문제

  • 첫번째풀이 각 숫자가 얼마나 중복되는지 미리 count하고 계산하는방법

  • 두번째풀이 모든 수열을 구한다음, 중복을 제거하는 방식으로 풀 수 있다. n과 m(5) 문제풀이 + 중복제거 추가

Leave a comment