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);
        }

    }
}

λ°˜μ‘ν˜•
Share Link
reply
λ°˜μ‘ν˜•
Β«   2024/11   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
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 29 30