Algorithm/백준

[백준] 15655번 N과 M (6)

sirius 2021. 3. 3. 09:50
https://www.acmicpc.net/problem/15655
 

15655번: N과 M (6)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

start 를 i + 1로 하여 중복이 발생하지 않게 함

 

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

public class Main {

    public static int N, M;
    public static int[] ans;
    public static int[] arr;
    public static boolean[] visit;
    public static StringBuffer sb = new StringBuffer();

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken()); // 자연수 개수
        M = Integer.parseInt(st.nextToken()); // 자연수
        ans = new int[M];
        arr = new int[N];
        visit = new boolean[N];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
       		arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        dfs(0, 0);
        System.out.println(sb);

    }

    private static void dfs(int start, int depth) {
        if(depth == M) {
            for(int val : ans) {
            	sb.append(val).append(" ");
            }
            sb.append("\n");
            return;
        }

        for(int i = start ; i < N; i ++) {
            if(!visit[i]) {
                visit[i] = true;
                ans[depth] = arr[i];
                dfs(i + 1, depth + 1);
                visit[i] = false;
            }
        }

    }
}