Permutation, Combination, Subset
์กฐํฉ๋ก (Combinatorics) ์๊ณ ๋ฆฌ์ฆ ์ธ ๊ฐ์ง์ธ Permutation(์์ด), Combination(์กฐํฉ), Subset(๋ถ๋ถ์งํฉ) ์.
์ด ์ธ ๊ฐ์ง๋ ์์ ํ์, ๋ฐฑํ๋ํน, DFS ๋ฌธ์ ์ ์์ฃผ ํ์ฉ๋๊ณ , ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ ๋ฟ๋ง ์๋๋ผ ์ค์ ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ํ ๋๋ ์ ์ฉํจ.
1. ๊ฐ๋
์์ฝ
์ฉ์ด
์ค๋ช
์์ ([1, 2, 3]
)
์์ ๊ณ ๋ ค
Permutation (์์ด)
n๊ฐ ์ค r๊ฐ๋ฅผ ์์ ์๊ฒ ์ ํ
[1,2]
, [2,1]
, [1,3]
...
โ Yes
Combination (์กฐํฉ)
n๊ฐ ์ค r๊ฐ๋ฅผ ์์ ์์ด ์ ํ
[1,2]
, [1,3]
, [2,3]
โ No
Subset (๋ถ๋ถ์งํฉ)
n๊ฐ ์์์ ๋ชจ๋ ์กฐํฉ(ํฌํจ/๋นํฌํจ)
[]
, [1]
, [2,3]
, [1,2,3]
๋ฑ
โ No (์งํฉ)
Permutation(์์ด)
๊ฐ๋
์์ ์ค์
์์
void permute(int[] arr, boolean[] visited, List<Integer> path) {
if(path.size() == r) { // r ์ ์ ์ญ ๋ณ์
System.out.println(path);
return;
}
for(int i = 0; i < arr.length; i++) {
if(!visited[i]) {
visited[i] = true;
path.add(arr[i]);
permute(arr, visited, path);
path.remove(path.size() - 1);
visited[i] = false;
}
}
}
ํธ์ถ :
permute(arr, new boolean[arr.length], new ArrayList<>());
Combination(์กฐํฉ)
๊ฐ๋
์์ ์ค์ํ์ง ์์.
์์
void combine(int[] arr, int start, List<Integer> path) {
if(path.size() == r) { // r ์ ์ ์ญ ๋ณ์
System.out.println(path);
return;
}
for(int i = start; i < arr.length; i++) {
path.add(arr[i]);
combine(arr, i + 1, path);
path.remove(path.size() - 1);
}
}
ํธ์ถ :
combine(arr, 0, new ArrayList<>());
Subset(๋ถ๋ถ์งํฉ)
๊ฐ๋
ํฌํจ/ ๋นํฌํจ์ ๋ชจ๋ ๊ฒฝ์ฐ
์์ n ๊ฐ โ ๋ถ๋ถ์งํฉ ๊ฐ์
์์ 1 : ์ฌ๊ท
void subset(int[] arr, int idx, List<Integer> path) {
if (idx == arr.length) {
System.out.println(path);
return;
}
// ํ์ฌ ์์ ํฌํจ
path.add(arr[idx]);
subset(arr, idx + 1, path);
path.remove(path.size() - 1);
// ํ์ฌ ์์ ๋ฏธํฌํจ
subset(arr, idx + 1, path);
}
ํธ์ถ :
subset(arr, 0, new ArrayList<>());
์์ 2 : ๋นํธ๋ง์คํฌ
for(int i = 0; i < ( 1 << n ); i++) {
List<Integer> subset = new ArrayList<>();
for(int j = 0; j < n; j++) {
if((i & (1 << j)) > 0) {
subset.add(arr[j]);
}
}
System.out.println(subset);
}
์ฐจ์ด์ ์ ๋ฆฌ
์์
์ค์ํจ
์๊ด ์์
์์
์ค๋ณต
์๋จ (๊ธฐ๋ณธ)
์๋จ (๊ธฐ๋ณธ)
์ผ๋ถ ํฌํจ๋จ
๊ธธ์ด
๊ณ ์ r๊ฐ
๊ณ ์ r๊ฐ
0 ~ n
์ถ๋ ฅ ์
[1, 2]
, [2, 1]
[1, 2]
, [2, 1]
์ ์ค๋ณต โ [1, 2]
๋ง
๋ชจ๋ ์กฐํฉ ๊ฐ๋ฅ
์๊ฐ๋ณต์ก๋
Permutation
O(n!)
Combination
O(2โฟ) ๋๋ O(nCr)
Subset
O(2โฟ)
๋ฐ๋ผ์ ์์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ์์ด์ ์กฐํฉ๋ณด๋ค, ์กฐํฉ์ ๋ถ๋ถ์งํฉ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ํญ๋ฐํจ. ( ์๊ฐ๋ณต์ก๋๊ฐ ๋๋ฌด ๋นจ๋ฆฌ ์ปค์ง)
์ค์ ์ฝ๋ฉํ ์คํธ์์๋ ๋ณดํต n <= 10 ~ 15 ์์ค์์๋ง ์์ ํ์ ์ ์ฉ ๊ฐ๋ฅ
4. ํ์ฉ ์์
์์ด
๊ฒฝ๋ก ํ์ (์ฌํ ๊ฒฝ๋ก, ์ธํ์ ๋ฌธ์ ), ์๋ฆฌ ๋ฐฐ์น
์กฐํฉ
๋ถ๋ถํฉ ๋ฌธ์ , ํ ๊ตฌ์ฑ, ๋น๋ฐ๋ฒํธ ์กฐํฉ
๋ถ๋ถ์งํฉ
์ต๋/์ต์ ํฉ, ํน์ ์กฐ๊ฑด ๋ง์กฑ ์กฐํฉ ์ฐพ๊ธฐ
Last updated
Was this helpful?