Algorithm

[Algo] 백준 15654 N과 M (5) JAVA

조핑구 2024. 5. 8. 13:54

문제 바로가기 : https://www.acmicpc.net/problem/15654

메모리 : 28436KB

시간 : 380ms

언어 : Java 11


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int N, M;
    static int[] arr;
    static int[] ans;
    static boolean[] check;
    static StringBuilder sb = new StringBuilder();

    public static <T> void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        arr = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        ans = new int[M];
        check = new boolean[N];
        dfs(0, 0);
        System.out.print(sb);
    }

    private static void dfs(int idx, int cnt) {
        if (cnt == M) {
            for (int i = 0; i < M; i++) {
                sb.append(ans[i]).append(" ");
            }
            sb.append("\n");
            return;
        }
        if (idx >= N) {
            return;
        }
        for (int i = 0; i < N; i++) {
            if (!check[i]) {
                check[i] = true;
                ans[cnt] = arr[i];
                dfs(idx + 1, cnt + 1);
                check[i] = false;
            }
        }
    }
}

풀이

N과 M 5탄 오름차순으로 출력해야하기 때문에 조합을 만들 숫자를 일단 정렬해줬다. 그 외에는 2탄과 비슷하다.