조합과 파워셋
조합
서로 다른 n개 중에서 r개 취하여 조를 만들 때, 이 하나하나의 조를 n개 중에서 r개 취한 조합
- 소스코드
import java.util.Arrays;
public class 조합 {
public static void main(String[] args) {
combination(new int[] { 1, 2, 3 }, new int[2], 0, 0);
}
static void combination(int[] arr, int[] sel, int idx, int cnt) {
if (cnt == sel.length) {
System.out.println(Arrays.toString(sel));
return;
}
if (idx == arr.length)
return;
sel[cnt] = arr[idx];
combination(arr, sel, idx + 1, cnt + 1);
combination(arr, sel, idx + 1, cnt);
}
- 결과
[1, 2]
[1, 3]
[2, 3]
파워셋
거듭제곱 집합 멱집합: 주어진 집합의 모든 부분집합들을 원소로 가지는 집합
1. 모든 부분 집합
- 소스코드
import java.util.Arrays;
public class 파워셋 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4 };
powerset(arr, new boolean[4], 0);
}
static void powerset(int[] arr, boolean sel[], int idx) {
if (idx == arr.length) {
for (int i = 0; i < arr.length; i++) {
if (sel[i])
System.out.print(arr[i]+" ");
}
System.out.println();
return;
}
sel[idx] = false;
powerset(arr, sel, idx + 1);
sel[idx] = true;
powerset(arr, sel, idx + 1);
}
}
- 결과
// 모두 false 인 경우
3
2
2 3
1
1 3
1 2
1 2 3
2. 응용) 부분집합의 갯수가 2인 결과만
- 소스코드
import java.util.Arrays;
public class 파워셋 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
powerset2(arr, new boolean[4], 0, 0);
}
static void powerset2(int[] arr, boolean sel[], int idx, int cnt) {
if (idx == arr.length) {
if (cnt == 2) {
for (int i = 0; i < arr.length; i++) {
if (sel[i])
System.out.print(arr[i]+" ");
}
System.out.println();
}
return;
}
sel[idx] = false;
powerset2(arr, sel, idx + 1, cnt);
sel[idx] = true;
powerset2(arr, sel, idx + 1, cnt + 1);
}
}
- 결과
2 3
1 3
1 2