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

조예빈·2024년 8월 15일
0

Coding Test

목록 보기
109/138

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

처음에는 되게 간단한 문제인줄 알았으나, dfs를 사용해야 하는 조금은 복잡한 문제였다. 우선, 깊이를 0으로 설정하여 dfs 함수를 호출한다. 이후 방문 처리를 해 주고, 깊이를 1씩 증가시켜 재귀를 통해 dfs함수를 호출시킨다. 깊이가 M과 같아지면 print를 해 주고, 방문 처리를 초기화하여 다음 순서로 넘어갈 수 있도록 구현해 주었다.

package silver3;

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

public class num15654 {
    public static int N;
    public static int M;
    public static boolean[] visited; //방문 여부를 저장할 배열
    public static int[] result; //순열을 저장할 배열
    public static int[] inputArr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        N = Integer.parseInt(input[0]);
        M = Integer.parseInt(input[1]);

        String[] input2 = br.readLine().split(" ");
        inputArr = new int[N];
        visited = new boolean[N];
        result = new int[M];

        for (int i = 0; i < N; i++) {
            inputArr[i] = Integer.parseInt(input2[i]);
        }
        Arrays.sort(inputArr); //오름차순 정렬
        dfs(0);
        br.close();
    }

    public static void dfs(int depth) {
        if (depth == M) {
            for (int i = 0; i < M; i++) {
                System.out.print(result[i] + " ");
            }
            System.out.println();
            return;
        }
        for (int i = 0; i < N; i++) {
            if (!visited[i]) {
                visited[i] = true;
                result[depth] = inputArr[i];
                dfs(depth + 1);
                visited[i] = false;
            }

        }
    }
}

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글