Bit Masking ๋นํธ ๋ง์คํน
๋นํธ ์ฐ์ฐ์์ ๋นํธ์ด์ ์ด์ฉํด ์๋ฆฌ์, ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ์ ์๋ค
์์ด๊ณผ ๋ถ๋ถ์งํฉ ์์ฑ์ ์ฌ์ฉ๋๋ ๋นํธ ์ฐ์ฐ์
- << ์ฐ์ฐ์
N << R
: ๋นํธ๋ก ํํ๋ ์์ธ N์ ๋นํธ์ด์ ์ผ์ชฝ์ผ๋ก R์นธ๋งํผ ์ด๋ - & ์ฐ์ฐ์
V1 & V2
: ๋นํธ๋ก ํํ๋ ์์ธ V1 ๊ณผ V2์ ๋นํธ์ด์ ๊ฐ๊ฐ ๋น๊ตํ์ฌ ๋ ์์ ํํ๋ ๋นํธ๊ฐ ๋ชจ๋ 1์ด๋ฉด 1, ์๋๋ฉด 0 - | ์ฐ์ฐ์
V1 | V2
: ๋นํธ๋ก ํํ๋ ์์ธ V1 ๊ณผ V2์ ๋นํธ์ด์ ๊ฐ๊ฐ ๋น๊ตํ์ฌ ๋ ์์ ํํ๋ ๋นํธ๊ฐ ๋ชจ๋ 0์ด๋ฉด 0, ์๋๋ฉด 1
- << ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ์๋ฆฌ๋ก ์์์ ์๋ฆฌ๋ฅผ ์ด๋์์ผ ์๋ฆฌ์, ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋งํน์ฒ๋ฆฌํ๋ ์ฉ๋๋กค ์ฌ์ฉ ๊ฐ๋ฅ
- & ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ์์๊ฐ ํด๋น ์๋ฆฌ์์ ์กด์ฌํ๋์ง ํน์, ํด๋น ์์๊ฐ ์ ํ ๋์๋์ง(์ฌ์ฉ ์ค์ธ์ง) ํ์ธ ๊ฐ๋ฅ
- | ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๊ธฐ์กด ์ํ์ ์ํ๋ ํน์ ์ํ๋ฅผ ์ถ๊ฐ ์ค์ ๊ฐ๋ฅ
Bit Masking์ ์ด์ฉํ ์์ด ๊ตฌํ
Java
public class BitMaskingTest {
static int N=3, R=3; // N๊ฐ์ ์ ์ค R๊ฐ๋ฅผ ์ค์ธ์ฐ๋ ์์ด
static int[] arr;
static int[] selected;
public static void main(String[] args) {
arr = new int[] {10, 5, 2, 7};
selected = new int[R]; // ์ค์ธ์์ง๋ ์์๋ค์ ์์ด ๋ฐฐ์ด
bitMaskingPerm(0, 0);
}
// ๋นํธ ๋ง์คํน์ ์ด์ฉํ ์์ด ๊ตฌํ๊ธฐ
private static void bitMaskingPerm(int depth, int flag) {
// ๊ธฐ์ ์กฐ๊ฑด
if (depth == R) {
System.out.prinln(Arrays.toString(selected));
return;
}
// ์ ๋ ํํธ
for (int i=0; i<N; i++) {
// i๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ๋ฐฉ๋ฌธ ๋์๋์ง ์ฒดํฌ
if ((flag & 1<<i) != 0) continue;
// ๋ฐฉ๋ฌธ์ด ์๋์ด์๋ค๋ฉด ์ฌ์ฉ
selected[depth] = arr[i];
// ๋ค์ ์๋ฆฌ์(๊น์ด)๋ก ์ด๋ํ ๋ค i๋ฒ์งธ ์ธ๋ฑ์ค๋ ์ฌ์ฉํ์์ ์ฒดํฌ
bitMaskingPerm(depth+1, flag | 1<<i);
}
}
}
์์ฉ - Bit Masking์ ์ด์ฉํ ๋ถ๋ถ ์งํฉ ๊ตฌํ
Java
public class SubsetBitMaskingTest {
static int N, input[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); // N๊ฐ์ ์๋ก ๋ง๋ค ์ ์๋ ๋ถ๋ถ์งํฉ
input = new int[N];
for (int i=0; i<N; i++) input[i] = sc.nextInt();
subsetBitMasking();
}
private static void subsetBitMasking() {
// N๊ฐ์ ์๋ก ๋ง๋ค ์ ์๋ ๋ถ๋ถ์งํฉ ๊ฒฝ์ฐ์ ์ 2^N (1<<N)
for (int bit=0; bit<(1<<N); bit++) {
// ์์ ์ ํ ์ฌ๋ถ(N๊ฐ์ ์์)
for (int i=0; i<N; i++) {
// ๊ฐ ๊ฒฝ์ฐ์ ์์ ์ธ๋ฑ์ค(0 ~ (2^N - 1))์ ๋นํธ์ด์ ํ์ธํ๋ฉฐ ๋ถ๋ถ์งํฉ ์์ ์๋ฆฌ๋ฅผ ๋งค์นญ์ํค๋ฉด ๋ถ๋ถ์งํฉ ์์ฑ ๊ฐ๋ฅ
if ((bit & (1<<i)) != 0){
System.out.print(input[i], " ");
}
}
System.out.println();
}
}
}