백준에 있는 문제 중 1182번을 풀면서 부분집합에 대한 내용이 나와서 간단하게 정리하려고 한다.
예를 들어 배열 [1,2,3]이 있다고 가정하자. 그러면 부분집합은 아래와 같다.
[1]
[2]
[3]
[1,2]
[1,3]
[2,3]
[1,2,3]
부분 집합을 구할 수 있는 방법은 조합을 이용한 방법이 있고 재귀를 이용한 방법이 있다. 이번에는 후자인 재귀에 대해서만 알아보도록 하겠다.
두 가지 경우를 생각해보면 된다.
- 현재 인덱스를 포함하는 경우
- 현재 인덱스를 포함하지 않는 경우
위의 두 가지 경우를 visited 배열에 방문했는지 체크함으로써 분기시킬 수 있다. 두 가지 경우에 대해서 모두 확인한 후에 현재 인덱스가 n이 되면 출력한다.
출력할 때는 visited 배열의 값이 true인 원소들만 출력한다.
코드는 아래와 같다.
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 31 32 33 34 35 36 37 38 39 40
| public class Main { private static int n = 3; private static boolean[] visited = new boolean[n];
public static void main(String[] args) { int[] arr = {1, 2, 3}; getSet(arr, 0); }
private static void getSet(int[] arr, int index) { if (index == n) { print(arr); return; }
visited[index] = false; getSet(arr, index + 1);
visited[index] = true; getSet(arr, index + 1);
}
private static void print(int[] arr) { for (int i = 0; i < arr.length; i++) { if(visited[i]){ System.out.print(arr[i]+" "); } } System.out.println(); } }
3 2 2 3 1 1 3 1 2 1 2 3
|
참고