Post

subset

🙋‍♂️ 들어가며

이번 시간에는 subset을 구하는 방법을 2개로 알아볼 것이다

back-tracking vs bit-masking

배열이 이렇게 있다고 가정하자

1
int[] arr = {1, 6, 13, 9, 27, 100};

백트랙킹으로 보면 다음과 같이 진행될 것이다

1
2
3
4
5
            []
        /         \
      [1]          []
     /   \        /   \
  [1,6]  [1]    [6]    []

2가지로 나누기에 시간복잡도 -> O(2^N)

✅ 코드 (back-tracking)

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
53
package boj;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

import java.util.Arrays;


public class Main {
	static int r;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[] arr = {1, 6, 13, 9, 27, 100};
		r = arr.length;
		
		int[] subset = new int[r];
		
		lets_find(0, 0, arr, subset);
	}
	
	
	
	static void lets_find(int depth, int size, int[] arr, int[] subset) {
		// 1. 최대깊이 도달시
		if (depth == r) {
			int[] answer = new int[size];
			for (int i = 0; i < size; i++) {
				answer[i] = subset[i];
			}
			System.out.println(Arrays.toString(answer));
			return;
		}
		
		
		// 2. 최대 깊이 도달 못했으면
		subset[size] = arr[depth];
		
		// 2-1. 선택
		lets_find(depth + 1, size + 1, arr, subset);
		
		// 2-2. 미선택
		lets_find(depth + 1, size, arr, subset);
	}
	
	
	

	
	
	
}




다음은 비스마스킹이다

시간복잡도는 O(N^2)

실제로 n <= 20 일때 많이 사용한다

코드는 다음과 같다

✅ 코드 (bit-masking)

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
package boj;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

import java.util.Arrays;


public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[] arr = {1, 6, 13, 9, 27, 100};
		int total = 1 << arr.length;
		int n = arr.length;
		
		for (int bit = 0; bit < total; bit++) {
			int[] subset = new int[n];
			int size = 0;
			for (int mask = 0; mask < n; mask++) {
				if ( (bit & (1<<mask) ) != 0 ) {
					subset[size] = arr[mask];
					size++;
				}
			}
			// 출력
			int[] result = new int[size];
			for (int i = 0; i < size; i++) {
				result[i] = subset[i];
			}
			System.out.println(Arrays.toString(result));
		}
		
		
		
	}	
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?