EOZIN 2021. 10. 5. 14:33
728x90

조합

  1. For문 사용 ( n이 정해져 있을 때)
public class 조합_for {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};

        // 5C3 arr의 5개 원소중 임의의 3개 선택
        for (int i = 0; i < arr.length - 2; i++)
            for (int j = i + 1; j < arr.length - 1; j++)
                for (int k = j + 1; k < arr.length; k++)
                    System.out.println(arr[i] + " " + arr[j] + " " + arr[k]);
    }
}
  1. 재귀사용
import java.util.Arrays;

public class 조합_재귀 {

    public static int[] arr = { 1, 3, 5, 7, 9 };
    public static int[] trr; // 선택한 원소를 저장할 배열

    public static void main(String[] args) {
        int n = arr.length;
        int r = 3;
        trr = new int[r];

        comb(n, r);
    }

    public static void comb(int n, int r) {
        if (r == 0) { // 종료파트
            System.out.println(Arrays.toString(trr));
        } else if (n < r) {
            return; // 조합 규칙에 벗어남 nCr! n개중에 r개뽑을때, r이 더 클 수 없음.
        } else { // 재귀파트
            trr[r - 1] = arr[n - 1];
            comb(n - 1, r - 1);
            comb(n - 1, r);
        }
    }
}
  1. 비트마스크 사용
public class 조합_비트마스크 {

    public static char[] src = {'A', 'B', 'C', 'D', 'E'};
    public static void main(String[] args) {

        // 3개 뽑기
        for (int i = 0; i < 1 << src.length; i++) {
              // true가 3개인것 뽑기
            if(Integer.bitCount(i) == 3) {
                for (int j = 0; j < src.length; j++) {
                    if ( (i & (1 << j)) > 0) {
                        System.out.print(src[j] + " ");
                    }
                }
                System.out.println();
            }
        }
    }
}