https://www.acmicpc.net/problem/15656
N개의 자연수 중에서 M개를 고른 수열중복 순열을 구하는 문제
15651번: N과 M (3)은 1부터 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) { // m개를 골랐다면 출력
for (int i : li) sb.append(i).append(" ");
sb.append("\n");
return;
}
// 모든 수 담기
for (int i = 0; i < n; i++) {
li[idx] = nums[i];
dfs(idx + 1); // 재귀
}
}
visited 배열은 필요 없습니다.import java.io.*;
import java.util.*;
public class Main_15656 {
static StringBuilder sb = new StringBuilder();
static int n, m;
static int[] li, nums;
private static void dfs(int idx) {
if (idx == m) {
for (int i : li) sb.append(i).append(" ");
sb.append("\n");
return;
}
for (int i = 0; i < n; i++) {
li[idx] = nums[i];
dfs(idx + 1);
}
}
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];
dfs(0);
System.out.println(sb.toString());
}
}