문제 출처: https://www.acmicpc.net/problem/15666
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static Set<String> set = new LinkedHashSet<>(); // 중복 제거 + 순서보장
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder(); // 마지막 출력 저장용
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int N = Integer.parseInt(tokenizer.nextToken()); // N개의 자연수 중
int M = Integer.parseInt(tokenizer.nextToken()); // M개를 고름
tokenizer = new StringTokenizer(reader.readLine());
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(tokenizer.nextToken());
}
Arrays.sort(arr); // 사전순 출력 위한 정렬
combiRepeat(arr, 0, 0, M, new StringBuilder());
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
sb.append(iterator.next()).append("\n");
}
sb.setLength(sb.length() - 1);
System.out.println(sb);
}
private static void combiRepeat(int[] arr, int start, int count, int M, StringBuilder sb) {
if (count == M) {
set.add(sb.toString());
return;
}
for (int i = start; i < arr.length; i++) {
int size = sb.length();
sb.append(arr[i]).append(" ");
combiRepeat(arr, i, count + 1, M, sb);
sb.setLength(size);
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static StringBuilder result = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int N = Integer.parseInt(tokenizer.nextToken()); // N개의 자연수 중
int M = Integer.parseInt(tokenizer.nextToken()); // M개를 고름
tokenizer = new StringTokenizer(reader.readLine());
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(tokenizer.nextToken());
}
Arrays.sort(arr); // 사전순 출력 위한 정렬
combiRepeat(arr, 0, 0, M, new StringBuilder());
System.out.println(result);
}
private static void combiRepeat(int[] arr, int start, int count, int M, StringBuilder sb) {
if (count == M) {
result.append(sb).append("\n");
return;
}
int temp = 0; // 직전에 처리한 수를 기억하기 위한 변수
for (int i = start; i < arr.length; i++) {
if (arr[i] != temp) {
int size = sb.length();
sb.append(arr[i]).append(" ");
combiRepeat(arr, i, count + 1, M, sb);
sb.setLength(size);
temp = arr[i];
}
}
}
}