![[백준] 15663 N과 M(9) - JAVA](/images/blog/15663-n-m-9-java/image-01.png)
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;
}
}
}
}