Bit Masking ๋น„ํŠธ ๋งˆ์Šคํ‚น

๋น„ํŠธ ์—ฐ์‚ฐ์ž์™€ ๋น„ํŠธ์—ด์„ ์ด์šฉํ•ด ์ž๋ฆฌ์ˆ˜, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค

์ˆœ์—ด๊ณผ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ƒ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋น„ํŠธ ์—ฐ์‚ฐ์ž

  1. << ์—ฐ์‚ฐ์ž N << R : ๋น„ํŠธ๋กœ ํ‘œํ˜„๋œ ์ˆ˜์ธ N์˜ ๋น„ํŠธ์—ด์„ ์™ผ์ชฝ์œผ๋กœ R์นธ๋งŒํผ ์ด๋™
  2. & ์—ฐ์‚ฐ์ž V1 & V2 : ๋น„ํŠธ๋กœ ํ‘œํ˜„๋œ ์ˆ˜์ธ V1 ๊ณผ V2์˜ ๋น„ํŠธ์—ด์„ ๊ฐ๊ฐ ๋น„๊ตํ•˜์—ฌ ๋‘ ์ˆ˜์— ํ‘œํ˜„๋œ ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 1์ด๋ฉด 1, ์•„๋‹ˆ๋ฉด 0
  3. | ์—ฐ์‚ฐ์ž 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();
        }
    }

}