PowerSet
- n개의 원소를 가지는 배열의 모든 부분집합(2^n개)을 구하는 문제
조건
- n개의 원소의 부분집합은 총 2^n개
풀이전략
(1) n개의 배열의 각 원소가 부분집합에 포함되는지 여부를 나타내는 부분집합포함 배열 선언
+ 예를 들어 { 0, 1, 2, 3 } 의 부분집합 중 { 0, 2 } 를 부분집합포함 배열을 이용하여 나타내면 { 1, 0, 1, 0 } 이다
+ 예를 들어 { 0, 1, 2, 3 } 의 부분집합 중 { 0, 2 } 를 부분집합포함 배열을 이용하여 나타내면 { 1, 0, 1, 0 } 이다
(2) 부분집합포함 배열의 인덱스를 0부터 3까지 증가시키면서 인덱스에 해당하는 원소를 포함하는 경우(1)와
포함하지 않는 경우(0)을 각각 백트래킹을 실행한다.
포함하지 않는 경우(0)을 각각 백트래킹을 실행한다.
구현하기
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 41 42 43 44 45 46 47 48 49 50 51 52 | /** * n개의 원소를 가지는 배열에서 모든 부분집합(2^n개)를 * 백트래킹 기법으로 구함 * @author troh * */ public class Stack백트래킹_PowerSet { // n개의 원소를 가지는 배열 private static int[] arr = {0, 1, 2, 3, 4}; // arr의 각 인덱스가 부분집합에 포함되는지 0 또는 1로 표시하는 배열 private static int[] inclusionArr = new int[arr.length]; // 불포함, 포함 배열을 나타냄 private static int[] candidates = {0, 1}; public static void main(String[] args) { backTracking(inclusionArr, -1, inclusionArr.length-1); } /** * @param inclusionArr 부분집합포함 배열 * @param incIndex inclusionArr의 인덱스 * @param incLastIndex inclusionArr의 마지막 */ public static void backTracking(int[] inclusionArr, int incIndex, int incLastIndex) { // 부분집합포함 배열의 마지막까지 백트래킹이 실행되었다면 결과출력 if(incIndex == incLastIndex) { System.out.printf("{"); for(int i=0; i<inclusionArr.length; i++) { // 부분집합포함배열에 포함될 경우에만 원소를 출력 if(inclusionArr[i] == 1) { System.out.printf(" %d,", arr[i]); } } System.out.printf("}\n"); } else { // 부분집합포함 배열의 인덱스를 증가시킴 incIndex++; // 해당 인덱스의 원소를 포함하는 경우와 포함하지않는 경우로 백트래킹 실행 for(int i=0; i<candidates.length; i++) { inclusionArr[incIndex] = candidates[i]; backTracking(inclusionArr, incIndex, incLastIndex); } } } } | cs |
배운점..
음.. 뭐 저번에 NQueen문제를 백트래킹으로 구현하며 너무 삽질을 많이해서 이번 문제는 풀만하게 느껴진 것 같다. 그래도 백트래킹 기법에 대해 좀 더 이해할 수 있는 문제였다.
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
백트래킹 - 순열 (0) | 2019.05.18 |
---|---|
백트래킹 - NQueen (0) | 2019.05.15 |
Stack(3) - 계산기(문자열 수식), 백트래킹 기법 (0) | 2019.04.04 |
Stack(2) - DP(동적 계획법), DFS(깊이우선탐색) (0) | 2019.03.23 |
Stack(1) - 스택과 memorization (0) | 2019.03.19 |