Skip to content

Commit

Permalink
2020-02-28 [Algorithm] BitMask Add
Browse files Browse the repository at this point in the history
  • Loading branch information
gyusuk committed Feb 27, 2020
1 parent ffc5827 commit 5732819
Showing 1 changed file with 195 additions and 0 deletions.
195 changes: 195 additions & 0 deletions Algorithm/๋น„ํŠธ๋งˆ์Šคํฌ(BitMask).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
## ๋น„ํŠธ๋งˆ์Šคํฌ(BitMask)

> ์ง‘ํ•ฉ์˜ ์š”์†Œ๋“ค์˜ ๊ตฌ์„ฑ ์—ฌ๋ถ€๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์œ ์šฉํ•œ ํ…Œํฌ๋‹‰
<br>

##### *์™œ ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?*

- DP๋‚˜ ์ˆœ์—ด ๋“ฑ, ๋ฐฐ์—ด ํ™œ์šฉ๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ
- ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„์œผ๋กœ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅ (But, ์›์†Œ์˜ ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์•„์•ผ ํ•จ)
- ์ง‘ํ•ฉ์„ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

- ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง

<br>

##### *๋น„ํŠธ(Bit)๋ž€?*

> ์ปดํ“จํ„ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ตœ์†Œ ๋‹จ์œ„ (0๊ณผ 1)
>
> 2์ง„๋ฒ•์„ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.
<br>

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” 10์ง„์ˆ˜๋ฅผ 2์ง„์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด?

`9(10์ง„์ˆ˜) โ†’ 1001(2์ง„์ˆ˜)`

<br>

#### ๋น„ํŠธ๋งˆ์Šคํ‚น ํ™œ์šฉํ•ด๋ณด๊ธฐ

> 0๊ณผ 1๋กœ, flag ํ™œ์šฉํ•˜๊ธฐ
[1, 2, 3, 4 ,5] ๋ผ๋Š” ์ง‘ํ•ฉ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์—ฌ๊ธฐ์„œ ์ž„์˜๋กœ ๋ช‡ ๊ฐœ๋ฅผ ๊ณจ๋ผ ๋ฝ‘์•„์„œ ํ™•์ธ์„ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ฃผ์–ด์กŒ๋‹ค. (์ฆ‰, ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์˜๋ฏธ)

```
{1}, {2} , ... , {1,2} , ... , {1,2,5} , ... , {1,2,3,4,5}
```

๋ฌผ๋ก , ๊ฐ„๋‹จํžˆ for๋ฌธ ๋Œ๋ ค๊ฐ€๋ฉฐ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋ฉฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆœ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ํ•˜๋ฉด, ๊ฐ ์š”์†Œ๋ฅผ ์ธ๋ฑ์Šค์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•˜์—ฌ ํšจ์œจ์ ์ธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

```
[1,2,3,4,5] โ†’ 11111
[2,3,4,5] โ†’ 11110
[1,2,5] โ†’ 10011
[2] โ†’ 00010
```

์ง‘ํ•ฉ์˜ i๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด `1`, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด `0`์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ 2์ง„์ˆ˜๋Š” ๋‹ค์‹œ 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

`11111`์€ 10์ง„์ˆ˜๋กœ 31์ด๋ฏ€๋กœ, ๋ถ€๋ถ„์ง‘ํ•ฉ์„ **์ •์ˆ˜๋ฅผ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ**์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

> 31์€ [1,2,3,4,5] ์ „์ฒด์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ง‘ํ•ฉ์— ํ•ด๋‹นํ•œ๋‹ค๋Š” ์˜๋ฏธ!
์ด๋กœ์จ, ํ•ด๋‹น ๋ถ€๋ถ„์ง‘ํ•ฉ์— i๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„๋•Œ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

์ด๋Ÿฐ ํ–‰์œ„๋Š” **๋น„ํŠธ ์—ฐ์‚ฐ**์„ ํ†ตํ•ด ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

<br>

#### ๋น„ํŠธ ์—ฐ์‚ฐ

> AND, OR, XOR, NOT, SHIFT
- AND(&) : ๋Œ€์‘ํ•˜๋Š” ๋‘ ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 1์ผ ๋•Œ, 1 ๋ฐ˜ํ™˜

- OR(|) : ๋Œ€์‘ํ•˜๋Š” ๋‘ ๋น„ํŠธ ์ค‘ ๋ชจ๋‘ 1์ด๊ฑฐ๋‚˜ ํ•˜๋‚˜๋ผ๋„ 1์ผ๋•Œ, 1 ๋ฐ˜ํ™˜

- XOR(^) : ๋Œ€์‘ํ•˜๋Š” ๋‘ ๋น„ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ, 1 ๋ฐ˜ํ™˜

- NOT(~) : ๋น„ํŠธ ๊ฐ’ ๋ฐ˜์ „ํ•˜์—ฌ ๋ฐ˜ํ™˜

- SHIFT(>>, <<) : ์™ผ์ชฝ ํ˜น์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ ์˜ฎ๊ฒจ ๋ฐ˜ํ™˜

- ์™ผ์ชฝ ์‹œํ”„ํŠธ : `A * 2^B`
- ์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ : `A / 2^B`

```
[์™ผ ์ชฝ] 0001 โ†’ 0010 โ†’ 0100 โ†’ 1000 : 1 โ†’ 2 โ†’ 4 โ†’ 8
[์˜ค๋ฅธ์ชฝ] 1000 โ†’ 0100 โ†’ 0010 โ†’ 0001 : 8 โ†’ 4 โ†’ 2 โ†’ 1
```

<br>

๋น„ํŠธ์—ฐ์‚ฐ ์—ฐ์Šต๋ฌธ์ œ : [๋ฐฑ์ค€ 12813](https://www.acmicpc.net/problem/12813)

##### ๊ตฌํ˜„ ์ฝ”๋“œ(C)

```C
#include <stdio.h>

int main(void) {
unsigned char A[100001] = { 0, };
unsigned char B[100001] = { 0, };
unsigned char ret[100001] = { 0, };
int i;

scanf("%s %s", &A, &B);

// AND
for (i = 0; i < 100000; i++)
ret[i] = A[i] & B[i];
puts(ret);

// OR
for (i = 0; i < 100000; i++)
ret[i] = A[i] | B[i];
puts(ret);

// XOR
for (i = 0; i < 100000; i++)
ret[i] = A[i] != B[i] ? '1' : '0';
puts(ret);

// ~A
for (i = 0; i < 100000; i++)
ret[i] = A[i] == '1' ? '0' : '1';
puts(ret);

// ~B
for (i = 0; i < 100000; i++)
ret[i] = B[i] == '1' ? '0' : '1';
puts(ret);

return 0;
}
```
<br>
์—ฐ์Šต์ด ๋˜์—ˆ๋‹ค๋ฉด, ๋‹ค์‹œ ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ ๋Œ์•„์™€ ๋น„ํŠธ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•ด๋ณด์ž
ํฌ๊ฒŒ ์‚ฝ์ž…, ์‚ญ์ œ, ์กฐํšŒ๋กœ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค.
<br>
#### 1.์‚ฝ์ž…
ํ˜„์žฌ ์ด์ง„์ˆ˜๋กœ `10101`๋กœ ํ‘œํ˜„๋˜๊ณ  ์žˆ์„ ๋•Œ, i๋ฒˆ์งธ ๋น„ํŠธ ๊ฐ’์„ 1๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
i = 3์ผ ๋•Œ ๋ณ€๊ฒฝ ํ›„์—๋Š” `11101`์ด ๋‚˜์™€์•ผ ํ•œ๋‹ค. ์ด๋•Œ๋Š” **OR์—ฐ์‚ฐ์„ ํ™œ์šฉ**ํ•œ๋‹ค.
```
10101 | 1 << 3
```
`1 << 3`์€ `1000`์ด๋ฏ€๋กœ `10101 | 01000`์ด ๋˜์–ด `11101`์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
<br>
#### 2.์‚ญ์ œ
๋ฐ˜๋Œ€๋กœ 0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, **AND์—ฐ์‚ฐ๊ณผ NOT ์—ฐ์‚ฐ์„ ํ™œ์šฉ**ํ•œ๋‹ค.
```
11101 & ~1 << 3
```
`~1 << 3`์€ `10111`์ด๋ฏ€๋กœ, `11101 & 10111`์ด ๋˜์–ด `10101`์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
<br>
#### 3.์กฐํšŒ
i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ ๋ฌด์Šจ ๊ฐ’์ธ์ง€ ์•Œ๋ ค๋ฉด, **AND์—ฐ์‚ฐ์„ ํ™œ์šฉ**ํ•œ๋‹ค.
```
10101 & 1 << i

3๋ฒˆ์งธ ๋น„ํŠธ ๊ฐ’ : 10101 & (1 << 3) = 10101 & 01000 โ†’ 0
4๋ฒˆ์งธ ๋น„ํŠธ ๊ฐ’ : 10101 & (1 << 4) = 10101 & 10000 โ†’ 10000
```
์ด์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๊ฐ’์ด 0์ด ๋‚˜์™”์„ ๋•Œ๋Š” i๋ฒˆ์งธ ๋น„ํŠธ ๊ฐ’์ด 0์ธ ๊ฒƒ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฐ˜๋Œ€๋กœ 0์ด ์•„๋‹ˆ๋ฉด ๋ฌด์กฐ๊ฑด 1์ธ ๊ฒƒ)
์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋น„ํŠธ๋งˆ์Šคํฌ๋‹ค.
<br>
๋น„ํŠธ๋งˆ์Šคํฌ ์—ฐ์Šต๋ฌธ์ œ : [๋ฐฑ์ค€ 2098](https://www.acmicpc.net/problem/2098)
<br>
ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ชจ๋“  ๋„์‹œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ๋‹ค์‹œ ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ์ตœ์†Œ ๊ฑฐ๋ฆฌ ๋น„์šฉ์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค.
์™„์ „ํƒ์ƒ‰์œผ๋กœ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, N์ด ์ตœ๋Œ€ 16์ด๊ธฐ ๋•Œ๋ฌธ์— 16!์œผ๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ DP๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“œ๋ฏ€๋กœ ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹์€ ๋ฌธ์ œ๋‹ค.

0 comments on commit 5732819

Please sign in to comment.