[백준] 15664 : N과 M(10)

이상훈·2023년 12월 25일
0

알고리즘

목록 보기
50/57
post-thumbnail

N과 M(10)

풀이

1) 먼저 입력받은 배열(arr)을 오름차순 정렬한다.
2) DFS에 start, cnt, visited 배열을 활용하여 조합 구하는 로직을 작성한다.
3) before 변수를 사용해 배열 내 이전 값과 현재 값이 중복인지 확인한다. 중복이면 지나간다. 이 과정이 없으면 위 예에서 result 값으로 [1 9], [7 9]가 중복으로 출력된다.

시간 복잡도 : O(2^N)


Java

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

public class Main {

    static int N,M;
    static int[] arr;

    static boolean[] visited;

    static int[] result;

    static StringBuilder sb = new StringBuilder();
    public static void DFS(int start, int cnt, boolean[] visited){

        if(cnt >= M){
            for(int j=0; j<M; j++){
                sb.append(result[j] +" ");
            }
            sb.append("\n");
            return;
        }
        int before = -1;
        for(int j=start; j<N; j++){
            if(before==arr[j] || visited[j]==true){
                continue;
            }
            else {
                visited[j] = true;
                result[cnt] = arr[j];
                before = arr[j];
                DFS(j + 1, cnt + 1, visited);
                visited[j] = false;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        arr = new int[N];
        result = new int[M];
        st = new StringTokenizer(br.readLine());
        for(int i=0; i<N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr);
        visited = new boolean[N];
        DFS(0,0, visited);

        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
}
profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글