View

[Java] 조합 (Combination)

옥돔이와 연근이 2022. 8. 30. 21:34
반응형
  • 순열과 조합의 차이
    뽑힌 자리 (순서의 의미 X )→ 조합 
    뽑힌 자리 (순서의 의미 0 )→ 순열

💡 조합

nCr

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class CombinationTest {

    static int N, R;
    static int totalCnt;
    static int[] arr, input;

    // nCr: n까지의 수 중 r개를 모두 뽑아서 순서있게 나열함(1<r<n)

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());

        totalCnt = 0;
        input = new int[N];
        arr = new int[R];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            input[i] = Integer.parseInt(st.nextToken());

        }

        com(0, 0);
        System.out.println("총 경우의 수 :" + totalCnt);
    }

    // cnt+1번째 해당하는 조합에서 포함될 수를 뽑기
    private static void com(int cnt, int start) {

        if (cnt == R) {
            totalCnt++;
            System.out.println(Arrays.toString(arr));
            return;
        }

        // 가능한 모든 수에 대해서 탐색 ->(input 배열의 모든 수를 시도해야함 )
        // start 부터 처리시 중복 수 추출 방지 및 순서가 다른 조합 추출을 방지함
        for (int i = start; i < N; i++) {
            // start 부터 처리 -> 중복체크가 필요 없어짐!
            arr[cnt] = input[i];
            // 다음 수 뽑으러
            com(cnt + 1, i + 1);
        }

    }
}

반응형

'Algorithm' 카테고리의 다른 글

[정올] 1828: 냉장고(Java)  (0) 2022.08.30
[BJ] 1541번: 잃어버린 괄호(Java)  (0) 2022.08.30
[Java] 순열/조합/부분집합  (0) 2022.08.30
[Java] 순열(permutation)  (0) 2022.08.30
[Java] BFS(Breadth First Search)  (0) 2022.08.30
Share Link
reply
반응형
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28