Post

subset

๐Ÿ™‹โ€โ™‚๏ธ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” subset์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ 2๊ฐœ๋กœ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค

back-tracking vs bit-masking

๋ฐฐ์—ด์ด ์ด๋ ‡๊ฒŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž

์•„๋ž˜ Java ์ฝ”๋“œ๋Š” combination ๊ด€์ ์—์„œ ์ ‘๊ทผํ•œ ํ•ต์‹ฌ ํ’€์ด์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ ์กฐ๊ฑด๊ณผ ์‹œ๊ฐ„ยท๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ คํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์œ„ ๊ตฌํ˜„์€ subset์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋„๋ก ์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ๊ณผ ๋ฐ˜๋ณต ๋ฒ”์œ„๋ฅผ ์ตœ์ ํ™”ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋ฐฑํŠธ๋ž™ํ‚น์œผ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋  ๊ฒƒ์ด๋‹ค

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

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

import java.util.Arrays;


public class Main {
	static int N;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[] arr = {1, 6, 13, 9, 27, 100};
		N = arr.length;
		
		
		for (int i = 0; i < N; i++) {
			int[] subset = new int[N];
			subset[0] = arr[i];
			comb(i+1, arr, subset, 1);
		}
	}
	
	
	static void comb(int depth, int[] arr, int[] subset, int size) {
		// 1. ์ตœ๋Œ€ ๊นŠ์ด ๋„๋‹ฌ์‹œ ์ถœ๋ ฅ
		if (depth == N) {
			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. ์„ ํƒ
		comb(depth+1, arr, subset, size+1);
		
		// 2-2. ๋ฏธ์„ ํƒ
		comb(depth+1, arr, subset, size);
	}
	

	
	
	
}
}




๋‹ค์Œ์€ ๋น„์Šค๋งˆ์Šคํ‚น์ด๋‹ค

์‹œ๊ฐ„๋ณต์žก๋„๋Š” 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