๐ Link : https://www.acmicpc.net/problem/15664
๐ก ์ ๊ทผ ๋ฐฉ๋ฒ
1. ๋ฌธ์ ์ดํด
๊ธฐ์กด N๊ณผ M์๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ด๋ ์ ๋ ๋ฐฑํธ๋ ํน์ ๋ํ ๊ฐ์ ์ตํ๊ณ ์๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์ ํน์ง์ด ๋ช ๊ฐ์ง๊ฐ ์๋ค.
- ์ค๋ณต๋ ์์ด์ ์ถ๋ ฅํ์ง ๋ง๋ผ
- ์์ด์ ์ฌ์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ
- ๊ณ ๋ฅธ ์์ด์ ๋น๋ด๋ฆผ์ฐจ์์ด์ด์ผ ํ๋ค(์ค๋ฆ์ฐจ์, ๊ฐ์ด ๊ฐ์๋ ๋๋ค)
2. ๋ฌธ์ ํ์ด
- ์ค๋ณต๋ ์์ด์ ์ถ๋ ฅํ์ง ๋ง๋ผ
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฃ๊ตฌ์กฐ Set์ ์ฌ์ฉํ ์์ ์ด๋ค. ํ์ง๋ง Set์ ์๋ฃ๊ตฌ์กฐ๋ ํฌ๊ฒ ์ธ๊ฐ์ง๋ก ๋๋๋๋ฐ ๊ฐ์์ ํน์ง์ด ์๊ธฐ ๋๋ฌธ์ ์๋ง์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํด์ผ ํ๋ค. ๋๋ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ ์ ๋ ฅํ ์์๋๋ก ์ถ๋ ฅ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ LinkedHashSet์ ์ฌ์ฉํ๋ค.
- HashSet : ์์๊ฐ์ ๋ณด์ฅํ์ง ์๋๋ค.
- TreeSet : ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ ์ฅ๋๋ค.
- LinkedHashSet : ์ถ๊ฐ๋ ์์๋๋ก ์ ์ฅ์ด ๋๋ค.
- ์์ด์ ์ฌ์ ์์ผ๋ก ์ถ๋ ฅํด๋ผ
- ์ ๋ ฌ์ ํด์ ํด๊ฒฐํ๋ค.
- ๊ณ ๋ฅธ ์์ด์ ๋น๋ด๋ฆผ์ฐจ์์ด์ด์ผ ํ๋ค(์ค๋ฆ์ฐจ์, ๊ฐ์ด ๊ฐ์๋ ๋๋ค)
- int []์ ๋ณต์ฌํด์ ์ ๋ ฌ ํ ๊ธฐ์กด์ ๊ฐ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ false ๊ฐ์ ๊ฒฝ์ฐ true๋ก ์ฒ๋ฆฌํด์ ํด๊ฒฐํ๋ค.
๐ ํ์ด ์ฝ๋
1์ฐจ ํ์ด์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static boolean[] isVisited;
static int[] temp, store;
static LinkedHashSet<String> answer;
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());
answer = new LinkedHashSet<>();
temp = new int[M];
isVisited = new boolean[N];
store = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(store);
backtracking(0);
answer.forEach(System.out::println);
}
private static void backtracking(int depth) {
if (depth == M) {
if (!validate()) return;
findAnswer();
return;
}
for (int i = 0; i < N; i++) {
if (!isVisited[i]) {
temp[depth] = store[i];
isVisited[i] = true;
backtracking(depth + 1);
isVisited[i] = false;
}
}
}
private static void findAnswer() {
StringBuilder sb = new StringBuilder();
for (int t : temp) {
sb.append(t).append(" ");
}
answer.add(sb.toString());
}
private static boolean validate() {
int[] copyTemp = temp.clone();
Arrays.sort(copyTemp);
return Arrays.equals(temp, copyTemp);
}
}
๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๋ป๊ฒ ํ์๋์ง ํ์ธํ๋ค๊ฐ ์๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฒ ๋๋ค. ์ฐ์ ๋๋ ๋น๋ด๋ฆผ์ฐจ์์ ๊ตฌํ๊ธฐ ์ํด Arrays.equals()๋ฅผ ์ฌ์ฉํด์ ๊ตฌํ์ ํ์ง๋ง ๊ธฐ์กด์ Arrays.sort(stroe)๋ก ์ ๋ ฌ์ ํด์ค ์ํ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์๋ค. ๋ํ ๊ฐ์ ์ธ๋ฑ์ค์ ์ ๊ทผ์ ๋ง๊ธฐ ์ํด์ isVisited []๋ฅผ ํ์ฉํ์ง๋ง ์ด ๋ถ๋ถ๋ ํจ๊ป ์ฒ๋ฆฌํ ์ ์์๋ค.
์๋ฅผ ๋ค์ด 1, 4, 7, 9๋ฉด ์ ๋ต์ (1-4, 1-7, 1-9, 4-7, 4-9, 7-9)๋ก ์ถ๋ ฅ์ด ๋๋ค. ์ฌ๊ธฐ์ ํฌ์ธํธ๊ฐ 7(index 2)-1(index 0)๊ณผ ๊ฐ์ด ์ ๋์ค๋ฉด ๋๋ค. backtracking์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ์กด depth์ start๋ฅผ ์ถ๊ฐ๋ฅผ ํด์ค์ ์ด๋ฅผ for ๋ฐ๋ณต๋ฌธ์์ ์์ ์ธ๋ฑ์ค๋ฅผ ์ค์ ์ ํด์ฃผ๋ฉด ์์ ๊ฐ์ ํ์์ ์คํ๋์ง ์๋๋ค. ๋ํ ๊ธฐ์กด ์ ๋ ฌ์ ํด์คฌ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋น๋ด๋ฆผ์ฐจ์์ ๊ฒ์ฆํ ํ์๋ ์์ด์ง๋ค.
2์ฐจ ํ์ด์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static int[] store, temp;
static LinkedHashSet<String> answer;
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());
store = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(store);
temp = new int[M];
answer = new LinkedHashSet<>();
backtrack(0, 0);
answer.forEach(System.out::println);
}
private static void backtrack(int depth, int start) {
if (depth == M) {
addCombination();
return;
}
for (int i = start; i < N; i++) {
temp[depth] = store[i];
backtrack(depth + 1, i + 1);
}
}
private static void addCombination() {
StringBuilder sb = new StringBuilder();
for (int number : temp) {
sb.append(number).append(" ");
}
answer.add(sb.toString());
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] 10971๋ฒ: ์ธํ์ ์ํ 2 (1) | 2024.04.10 |
---|---|
[Java] 2023๋ฒ: ์ ๊ธฐํ ์์ (0) | 2024.03.02 |
[Java] 19942๋ฒ: ๋ค์ด์ดํธ (0) | 2024.02.01 |
[Java] 15686๋ฒ: ์นํจ ๋ฐฐ๋ฌ (1) | 2024.01.30 |