알고리즘

부분집합 구하기(DFS)

podori 2022. 12. 10. 13:12

자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 출력하는 프로그램을 작성하시오.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Practice {
    static int number;
    static boolean[] check;
    public void DFS(int n){
        if (n == number + 1) {
            for (int i = 0; i < check.length; i++) {
                if (check[i]) System.out.print(i + " ");
            }
            System.out.println();
        } else {
            check[n] = true;
            DFS(n + 1);
            check[n] = false;
            DFS(n + 1);
        }
    }
 
    public static void main(String[] args){
        Practice pr = new Practice();
        pr.number = 3;
        check = new boolean[number+1];
        pr.DFS(1);
    }
}
cs

 

위의 코드는 아래와 같은 상태트리 구현으로 작성하였다. 

N을 입력받으면 1부터 시작하여 부분집합에 넣는 경우(O)와 넣지 않는 경우(X)를 DFS로 구현하였다.

숫자 i를 넣는 경우에는 check[i]를 true로 바꾼 상태에서 DFS(i+1)를 호출하였고, 넣지 앟는 경우에는 check[i]를 false로 변경하여 DFS(i+1)을 호출하였다.

만약 DFS(N+1)이 호출된다면 check배열이 true인 값들로만 출력되게 하여서 부분집합의 경우를 모두 나타냈다.