[백준] 15663 N과 M(9) - JAVA

N과 M 시리즈로 중복되는 이번엔 기존에 출력됐던 배열을 출력 안되게 하는 문제이다.

    static int N, M;
    static int[] arr, numbers;
    static boolean[] visited;

    public static 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];
        numbers = new int[M];
        visited = 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);
    }

main 부분은 다른 문제와 같이 BufferedReader로 입력받고 초기화해준 후 정렬했다.

    static void dfs(int depth) {
        if (depth == M) {
            for (int i = 0; i < M; i++) {
                System.out.print(numbers[i] + " ");
            }
            System.out.println();
            return;
        }

        for (int i = 0; i < N; i++) {
            if (!visited[i] && (i == 0 || arr[i] != arr[i - 1] || visited[i - 1])) {
                visited[i] = true;
                numbers[depth] = arr[i];
                dfs(depth + 1);
                visited[i] = false;
            }
        }
    }

다음으로 dfs

depth == M 즉 한 줄을 다 찾았으면 출력하고 종료한다.

그렇지 않으면 순회를 도는데 중복된 배열이 출력되지 않게 하는 부분은 아래 조건이다.

!visited[i] && (i == 0 || arr[i] != arr[i - 1] || visited[i - 1])

조건 1. 방문하지 않은 index일 때

조건 2

2.1 i == 0 : 첫 번째 원소는 중복될 원소가 없으므로 선택 사능

2.2 arr[i] != arr[i - 1] : 현재 숫자와 이전 숫자가 다르면 중복이 아님

2.3 visited[i - 1] : 첫번째 원소가 아니고 현재 숫자와 이 전 숫자가 다를 때. 즉 연속으로 같은 숫자가 있다면. 앞의 숫자가 이미 방문한 상태일 때만 선택 가능

최종 코드는 아래와 같다.

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, numbers;
    static boolean[] visited;

    public static 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];
        numbers = new int[M];
        visited = 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);
    }

    static void dfs(int depth) {
        if (depth == M) {
            for (int i = 0; i < M; i++) {
                System.out.print(numbers[i] + " ");
            }
            System.out.println();
            return;
        }

        for (int i = 0; i < N; i++) {
            if (!visited[i] && (i == 0 || arr[i] != arr[i - 1] || visited[i - 1])) {
                visited[i] = true;
                numbers[depth] = arr[i];
                dfs(depth + 1);
                visited[i] = false;
            }
        }
    }
}