https://www.acmicpc.net/problem/15663
N개의 자연수 중에서 M개를 고른 수열중복되는 값이 존재하는 N개의 자연수 중에서 순열을 뽑아내는 문제입니다.
st = new StringTokenizer(br.readLine());
nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = Integer.parseInt(st.nextToken());
Arrays.sort(nums);
private static void dfs(int idx) {
if (idx == m) {
for (int i : li) sb.append(i).append(" ");
sb.append("\n");
return;
}
int prev = 0; // 동일 레벨에서 중복값을 판단하는 변수
for (int i = 0; i < n; i++) {
if (!visited[i] && nums[i] != prev) { // 같은 값을 넣으려고 하면 안 됨
visited[i] = true; // 방문 처리
li[idx] = nums[i];
prev = nums[i]; // 값 할당
dfs(idx + 1); // 재귀
visited[i] = false; // 백트래킹
}
}
}
import java.io.*;
import java.util.*;
public class Main_15663 {
static StringBuilder sb = new StringBuilder();
static int n, m;
static int[] li, nums;
static boolean[] visited;
private static void dfs(int idx) {
if (idx == m) {
for (int i : li) sb.append(i).append(" ");
sb.append("\n");
return;
}
int prev = 0;
for (int i = 0; i < n; i++) {
if (!visited[i] && nums[i] != prev) {
visited[i] = true;
li[idx] = nums[i];
prev = nums[i];
dfs(idx + 1);
visited[i] = false;
}
}
}
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());
st = new StringTokenizer(br.readLine());
nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = Integer.parseInt(st.nextToken());
Arrays.sort(nums);
li = new int[m];
visited = new boolean[n];
dfs(0);
System.out.println(sb.toString());
}
}