조합

조합

조합 (Combination) 서로 다른 n개 중에서 r개를 선택하는 경우의 수 (순서 X, 중복 X)
예시) 서로 다른 4명 중 주번 2명 뽑는 방법
n𝐶r =𝑛!/(𝑛−𝑟)!𝑟!=𝑛𝑃𝑟/𝑟! 단, 0<𝑟≤𝑛

중복 조합

서로 다른 n개 중에서 r개를 선택하는 경우의 수 (순서 X, 중복 O)
예시) 후보 2명, 유권자 3명일 때 무기명 투표 방법
𝑛𝐻𝑟=𝑛+𝑟−1𝐶𝑟

public class Practice4 {

    static int getCombination(int n, int r) {
        int pResult = 1;
        for (int i = n; i >= n - r + 1; i--) {
            pResult *= i;
        }

        int rResult = 1;
        for (int i = 1; i <= r; i++) {
            rResult *= i;
        }

        return pResult / rResult;
    }

    public static void main(String[] args) {
        //1.    조합
        System.out.println("== 조합 ==");
        //서로 다른 4명 중 주번 2명 뽑는 경우의 수
        int n = 4;
        int r = 2;

        int pResult = 1;
        for (int i = n; i >= n - r + 1; i--) {
            pResult *= i;
        }

        int rResult = 1;
        for (int i = 1; i <= r; i++) {
            rResult *= i;
        }
        System.out.println("결과 : " + pResult / rResult);

        //2.    중복 조합
        System.out.println("== 중복 조합 ==");
        //후보 2명, 유권자 3명일 때 무기명 투표 경우의 수
        n = 2;
        r = 3;

        System.out.println("결과 : " + getCombination(n + r - 1, r));
    }
}
== 조합 ==
결과 : 6
== 중복 조합 ==
결과 : 4
//1,2,3,4를 이용하여 세자리 자연수를 만드는 방법(순서x, 중복x)의 각 결과를 출력.
public class Practice4_1 {
    public static void main(String[] args) {
        //Test Code
        int[] arr = {1, 2, 3, 4};
        boolean[] visited = {false, false, false, false};

        Practice4_1 p = new Practice4_1();
        p.combination(arr, visited, 0, 4, 3);
    }

    private void combination(int[] arr, boolean[] visited, int depth, int n, int r) {
        if (r == 0) {
            for (int i = 0; i < n; i++) {
                if (visited[i]) {
                    System.out.print(arr[i] + " ");
                }
            }
            System.out.println();
            return;
        }

        if (depth == n) {
            return;
        }

        visited[depth] = true;
        combination(arr, visited, depth + 1, n, r - 1);

        visited[depth] = false;
        combination(arr, visited, depth + 1, n, r);
    }
}
1 2 3 
1 2 4 
1 3 4 
2 3 4 
// Initial call
combination(arr, visited, 0, 4, 3)
// depth = 0, r = 3

visited[0] = true;  // visited = [true, false, false, false]
combination(arr, visited, 1, 4, 2)
// depth = 1, r = 2

visited[1] = true;  // visited = [true, true, false, false]
combination(arr, visited, 2, 4, 1)
// depth = 2, r = 1

visited[2] = true;  // visited = [true, true, true, false]
combination(arr, visited, 3, 4, 0)
// depth = 3, r = 0
// Output: 1 2 3

visited[2] = false;  // visited = [true, true, false, false]
combination(arr, visited, 3, 4, 1)
// depth = 3, r = 1

visited[3] = true;  // visited = [true, true, false, true]
combination(arr, visited, 4, 4, 0)
// depth = 4, r = 0
// Output: 1 2 4

visited[3] = false;  // visited = [true, true, false, false]
combination(arr, visited, 4, 4, 1)
// depth = 4, r = 1
// No output (base case reached)

visited[1] = false;  // visited = [true, false, false, false]
combination(arr, visited, 2, 4, 2)
// depth = 2, r = 2

visited[2] = true;  // visited = [true, false, true, false]
combination(arr, visited, 3, 4, 1)
// depth = 3, r = 1

visited[3] = true;  // visited = [true, false, true, true]
combination(arr, visited, 4, 4, 0)
// depth = 4, r = 0
// Output: 1 3 4

visited[3] = false;  // visited = [true, false, true, false]
combination(arr, visited, 4, 4, 1)
// depth = 4, r = 1
// No output (base case reached)

visited[2] = false;  // visited = [true, false, false, false]
combination(arr, visited, 3, 4, 2)
// depth = 3, r = 2

visited[3] = true;  // visited = [true, false, false, true]
combination(arr, visited, 4, 4, 1)
// depth = 4, r = 1
// No output (base case reached)

visited[3] = false;  // visited = [true, false, false, false]
combination(arr, visited, 4, 4, 2)
// depth = 4, r = 2
// No output (base case reached)

visited[0] = false;  // visited = [false, false, false, false]
combination(arr, visited, 1, 4, 3)
// depth = 1, r = 3

visited[1] = true;  // visited = [false, true, false, false]
combination(arr, visited, 2, 4, 2)
// depth = 2, r = 2

visited[2] = true;  // visited = [false, true, true, false]
combination(arr, visited, 3, 4, 1)
// depth = 3, r = 1

visited[3] = true;  // visited = [false, true, true, true]
combination(arr, visited, 4, 4, 0)
// depth = 4, r = 0
// Output: 2 3 4

visited[3] = false;  // visited = [false, true, true, false]
combination(arr, visited, 4, 4, 1)
// depth = 4, r = 1
// No output (base case reached)

visited[2] = false;  // visited = [false, true, false, false]
combination(arr, visited, 3, 4, 2)
// depth = 3, r = 2

visited[3] = true;  // visited = [false, true, false, true]
combination(arr, visited, 4, 4, 1)
// depth = 4, r = 1
// No output (base case reached)

visited[3] = false;  // visited = [false, true, false, false]
combination(arr, visited, 4, 4, 2)
// depth = 4, r = 2
// No output (base case reached)

visited[1] = false;  // visited = [false, false, false, false]
combination(arr, visited, 2, 4, 3)
// depth = 2, r = 3

visited[2] = true;  // visited = [false, false, true, false]
combination(arr, visited, 3, 4, 2)
// depth = 3, r = 2

visited[3] = true;  // visited = [false, false, true, true]
combination(arr, visited, 4, 4, 1)
// depth = 4, r = 1
// No output (base case reached)

visited[3] = false;  // visited = [false, false, true, false]
combination(arr, visited, 4, 4, 2)
// depth = 4, r = 2
// No output (base case reached)

visited[2] = false;  // visited = [false, false, false, false]
combination(arr, visited, 3, 4, 3)
// depth = 3, r = 3

visited[3] = true;  // visited = [false, false, false, true]
combination(arr, visited, 4, 4, 2)
// depth = 4, r = 2
// No output (base case reached)

visited[3] = false;  // visited = [false, false, false, false]
combination(arr, visited, 4, 4, 3)
// depth = 4, r = 3
// No output (base case reached)

출처 : 제로베이스

Leave a comment