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(์ˆœ์—ด)

๊ฐœ๋…

  • ์ˆœ์„œ ์ค‘์š”

  • nPr=n!(nโˆ’r)!nPr = \frac {n!}{(n-r)!}

์˜ˆ์‹œ

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(์กฐํ•ฉ)

๊ฐœ๋…

  • ์ˆœ์„œ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ.

  • nCr=n!r!(nโˆ’r)!)nCr = \frac{n!}{r!(n - r)!)}

์˜ˆ์‹œ

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 ๊ฐœ โ‡’ ๋ถ€๋ถ„์ง‘ํ•ฉ ๊ฐœ์ˆ˜ 2n2^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);
}

์ฐจ์ด์  ์ •๋ฆฌ

ํ•ญ๋ชฉ
Permutation
Combination
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?