Algorithm/백준

백준 [15663] N과 M (9)

youngjae-kim 2024. 3. 15. 19:28
728x90
반응형
 

15663번: N과 M (9)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

처음 풀이 

 

입력에 같은 숫자가 여러번 입력이 주어질 때 중복되는 수열을 걸러내기 위해 Set을 사용했다. 출력 시 사전 순으로 출력하기 위해 Set을 LinkedHashSet으로 선언해주었다.

 

코드

package com.baekjoon.p15663;

import java.util.*;

public class Main {
    static int N, M;
    static Set<String> ans = new LinkedHashSet<>();
    static int[] a, result;
    static boolean[] v;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        M = sc.nextInt();

        a = new int[N];
        result = new int[M];
        v = new boolean[N];

        for (int i = 0; i < N; i++) {
            a[i] = sc.nextInt();
        }

        Arrays.sort(a);

        dfs(0);

        StringBuilder sb = new StringBuilder();
        Iterator<String> it = ans.iterator();
        while (it.hasNext()) {
            sb.append(it.next());
        }
        System.out.println(sb);
        sc.close();
    }

    static void dfs(int depth) {

        if (depth == M) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < M; i++) {
                sb.append(result[i] + " ");
            }
            sb.append("\n");

            ans.add(sb.toString());
            return;
        }

        for (int i = 0; i < N; i++) {
            if (!v[i]) {
                v[i] = true;
                result[depth] = a[i];
                dfs(depth + 1);
                v[i] = false;
            }
        }
    }
}

 

 

다른 풀이

내가 현재 뽑은 값이 이전에 뽑은 값과 같은지 비교할 before 변수를 선언해줬다.

이렇게 되면 인덱스 값만 다른 동일한 값을 가지고 만드는 중복되는 수열을 만들지 않게 된다.

package com.baekjoon.p15663;

import java.util.*;

public class Main {
    static int N, M;
    static Set<String> ans = new LinkedHashSet<>();
    static int[] a, result;
    static boolean[] v;

    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        M = sc.nextInt();

        a = new int[N];
        result = new int[M];
        v = new boolean[N];

        for (int i = 0; i < N; i++) {
            a[i] = sc.nextInt();
        }

        Arrays.sort(a);

        dfs(0);

        System.out.println(sb);
        sc.close();
    }

    static void dfs(int depth) {

        if (depth == M) {
            // StringBuilder sb = new StringBuilder();
            for (int i = 0; i < M; i++) {
                sb.append(result[i] + " ");
            }
            sb.append("\n");
            return;
        }

        int before = 0;

        for (int i = 0; i < N; i++) {
            if (!v[i]) {
                if (before != a[i]) {
                    v[i] = true;
                    result[depth] = a[i];
                    before = a[i];
                    dfs(depth + 1);
                    v[i] = false;
                }
            }
        }
    }
}
728x90
반응형