문제링크 : https://www.acmicpc.net/problem/15663
체감 난이도 : 中
- Set 사용 : 중복되지 않는 수열을 만들기 위해서 set 사용
- Comparator 오버 라이딩 : 알아서 정렬되게 TreeSet 사용했더니 문자열이라 오름차순이 아닌 ex ) "11" < "6" 순으로 정렬함. (21%쯤에서 실패)
→ 직접 Comparator 오버 라이딩하는 방법 사용- Comparator 로직 : o1배열(왼)텍스트과 o2배열(오)의 원소들을 순서대로 비교하다가 원소가 같지 않으면 그 원소의 대소 관계를 비교한다.
(return값 <= 0 이면 그대로, return값 > 0 이면 자리 변경)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BJ15663_N과M9 {
static FastReader scan = new FastReader();
static int N, M;
static String[] arr;
static boolean[] visited;
static Set<String> answers = new HashSet<>();
public static void main(String[] args) {
input();
makeAnswers(0, 0, visited, "");
printAnswers();
}
private static void printAnswers() {
List<String[]> arrs = answers.stream()
.map(str -> str.split(" "))
.collect(Collectors.toList());
Collections.sort(arrs, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
for (int i = 0; i < M; i++) {
if (!o1[i].equals(o2[i])) {
if (Integer.valueOf(o1[i]).compareTo(Integer.valueOf(o2[i])) < 0) {
return -1;
}
return 1;
}
}
return 0;
}
});
for (String[] arr : arrs) {
System.out.println(String.join(" ", arr));
}
}
static void makeAnswers(int dept, int choice, boolean[] visited, String str) {
if (dept == M) {
answers.add(str);
return;
}
for (int i = 0; i < N; i++) {
if (!visited[i]) {
String chosen = arr[i];
visited[i] = true;
makeAnswers(
dept + 1, choice + 1, visited, str.equals("") ? chosen : str + " " + chosen);
visited[i] = false;
}
}
}
static void input(){
N = scan.nextInt();
M = scan.nextInt();
arr = new String[N];
visited = new boolean[N];
Arrays.fill(visited, false);
for (int i = 0; i < N; i++) {
arr[i] = scan.next();
}
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}