Algorithm & Data Structure/이론

조합(Combination) (+Java 코드)

체리1001 2024. 4. 22.

1. 조합(Combination)이란

조합은 n개의 숫자 중에서 r개를 뽑아야 할 때 순서를 고려하지 않고 뽑는 것을 말합니다.

 

2. 구현 방법

그렇다면 이 조합은 코드 상에서 어떻게 구현할 수 있을까요?

가장 중요한 포인트는 해당 인덱스의 숫자를 선택하냐, 안하냐의 두 가지가 경우가 존재한다는 것입니다!

(1) 백트래킹

백트래킹을 사용해서 조합을 구현할 때에는 start 변수를 사용합니다. start 변수는 인덱스를 표현하는데요. arr[start]의 값을 선택하든지, 선택하지 않든지 두 가지 경우가 생기게 됩니다.

 

선택하면 visited[start] = true 가 되고 선택하지 않으면 visited[start] = false가 되며 선택한 경우에는 start를 +1 증가시켜서 다음 숫자를 고르면 됩니다.

/**
* @param arr 숫자를 뽑아낼 배열
* @param visited 선택 여부를 체크할 배열
* @param start 시작 기준 인덱스
* @param n 기준 배열의 크기
* @param r 뽑고자 하는 숫자의 개수
*/
static void combination(int[] arr, boolean[] visited, int start, int n, int r) {
        if(r == 0) {
            print(arr, visited);
            return;
        }

        for(int i=start; i<n; i++) {
            visited[i] = true;
            combination(arr, visited, i+1, n, r-1);
            visited[i] = false;
        }
    }

static void print(int[] arr, boolean[] visited) {
    for(int i=0; i<visited.length; i++) {
        if(visited[i]) System.out.print(arr[i] + " ");
    }

    System.out.println();
}

(2) 재귀

재귀도 백트래킹과 동일한 방식으로 이루어집니다. 가장 중요한 것은 해당 인덱스의 데이터를 선택하는 경우+선택 안 하는 경우의 조합인거죠!

/**
* @param arr 숫자를 뽑아낼 배열
* @param visited 선택 여부를 체크할 배열
* @param depth 현재 진행 중인 깊이
* @param n 기준 배열의 크기
* @param r 뽑고자 하는 숫자의 개수
*/
static void combination(int[] arr, boolean[] visited, int depth, int n, int r) {
        if(r == 0) {
            print(arr, visited);
            return;
        }

        if(depth == n) return;

        visited[depth] = true;
        combination(arr, visited, depth+1, n, r-1); // arr[depth]를 선택하는 경우

        visited[depth] = false;
        combination(arr, visited, depth+1, n, r); // arr[depth]를 선택하지 않는 경우
    }

static void print(int[] arr, boolean[] visited) {
    for(int i=0; i<visited.length; i++) {
        if(visited[i]) System.out.print(arr[i] + " ");
    }

    System.out.println();
}

(3) 결과

백트래킹과 재귀 모두 해당 인덱스의 숫자를 선택하냐, 안하냐의 두 가지가 경우가 존재한다는 것이 가장 중요한 개념입니다!

 

참고 https://bcp0109.tistory.com/15

'Algorithm & Data Structure > 이론' 카테고리의 다른 글

순열(Permutation) (+Java 코드)  (0) 2024.04.22
다익스트라(dijkstra) 알고리즘 (+Java 코드)  (0) 2024.04.18
이분 탐색 (+Java)  (0) 2021.12.16
BFS와 DFS (+Java 코드)  (0) 2021.12.16
계수 정렬 (+Java 코드)  (0) 2021.08.09

댓글