๐ข 3. Binary Search & Bitwise Operations
๐ก ์ถ๊ฐ ์ง์
์ด์ง ํ์/์ด์ง ๊ฒ์
๋นํธ ์ฐ์ฐ
๐ซง ํธ๋ฆฌ
- : ํ๋์ ๋ฃจํธ ์ฝ๋๋ฅผ ๊ฐ์ง๋ค
๋ฃจํธ ๋ ธ๋๋ 0๊ฐ ์ด์์ ์์ ๋ ธ๋๋ฅผ ๊ฐ๊ณ ์๋ค
ํธ๋ฆฌ์๋ ์ฌ์ดํด ์กด์ฌํ ์ ์๋ค
๋ ธ๋๋ค์ ํน์ ์์๋ก ๋์ด๋ ์๋ ์๊ณ ๊ทธ๋ด ์ ์์ ์๋ ์๋ค
๊ฐ ๋ ธ๋๋ ์ด๋ค ์๋ฃํ์ผ๋ก๋ ํํ์ด ๊ฐ๋ฅํ๋ค
๐ซง ์ด์งํธ๋ฆฌ
: ๊ฐ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์์ ๊ฐ๋ ํธ๋ฆฌ
๐ซง ์ด์งํ์ํธ๋ฆฌ
- : โ๋ชจ๋ ์ผ์ชฝ ์์๋ค โค n < ๋ชจ๋ ์ค๋ฅธ์ชฝ ์์๋คโ ์์ฑ์ ๋ชจ๋ ๋ ธ๋ n์ ๋ํด์ ๋ฐ๋์ ์ฐธ์ด์ด์ผ ํจ
๋ชจ๋ ๋ ธ๋์ ๋ํด์ ์ผ์ชฝ ์์๋ค์ ๊ฐ์ด ํ์ฌ ๋ ธ๋ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋๋ก ํ๊ณ , ์ค๋ฅธ์ชฝ ์์๋ค ๊ฐ์ ํ์ฌ ๋ ธ๋์ ๊ฐ๋ณด๋ค ๋ฐ๋์ ์ปค์ผํจ
๐ซง ์ ์ด์งํธ๋ฆฌ
- : ๋ชจ๋ ๋ ธ๋์ ์์์ด ์๊ฑฐ๋ ์ ํํ ๋ ๊ฐ ์๋ ๊ฒฝ์ฐ
์์์ด ํ๋๋ง ์๋ ๋ ธ๋๊ฐ ์กด์ฌํด์๋ ์๋จ
๐ซง ํฌํ์ด์งํธ๋ฆฌ
- : ์ ์ด์ง ํธ๋ฆฌ์ด๋ฉด์ ์์ ์ด์ง ํธ๋ฆฌ์ธ ๊ฒฝ์ฐ
๋ชจ๋ ๋ง๋จ ๋ ธ๋๋ ๊ฐ์ ๋์ด์ ์์ด์ผ ํ๋ฉฐ, ๋ง์ง๋ง ๋จ๊ณ์์ ๋ ธ๋์ ๊ฐ์๊ฐ ์ต๋๊ฐ ๋์ด์ผ ํ๋ค
๋ ธ๋์ ๊ฐ์๊ฐ ์ ํํ 2^K-1 (K๋ ํธ๋ฆฌ์ ๋์ด) ๊ฐ
๐ซง ์ด์ง ํ์
์ฒ์์ N๊ฐ ํฌ๊ธฐ์ ๋ฐฐ์ด์์ ๋จ๊ณ๊ฐ ํ๋์ฉ ์ง๋๊ฐ์ ๋ฐ๋ผ ํ์ํ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ๋ฐ์ฉ ์ค์ด๋ค๊ธฐ ๋๋ฌธ
๐ซง (์ ์๊ฐ ์ ๋ ฌ๋ ๋ฐฐ์ด์์) ์ด์ง ํ์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int BSearch(int arr[], int target) {
int low = 0;
int high = arr.length - 1;
int mid;
while(low <= high) {
mid = (low + high) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] > target)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
๐ซง ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ์ด์ง ํ์
1
2
3
4
5
6
7
8
9
10
11
12
int BSearchRecursive(int arr[], int target, int low, int high) {
if (low > high)
return -1;
int mid = (low + high) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] > target)
return BSearchRecursive(arr, target, low, mid-1);
else
return BSearchRecursive(arr, target, mid+1, high);
}
๐ซง ๋นํธ ์กฐ์
- : 0s ๋ ๋ชจ๋ ๋นํธ๊ฐ 0 ์ธ ๊ฐ
1s ๋ ๋ชจ๋ ๋นํธ๊ฐ 1 ์ธ ๊ฐ
์ฐ์ฐ๋ค์ด ๋นํธ ๋จ์๋ก ์ด๋ฃจ์ด ์ง๋ค!
ํ ๋นํธ์์ ์ผ์ด๋๋ ์ผ์ด ๋ค๋ฅธ ๋นํธ์ ์ด๋ค ์ํฅ๋ ๋ฏธ์น์ง ์๋๋ค
๐ซง 2์ ๋ณด์์ ์์
- : ์ปดํจํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์๋ฅผ ์ ์ฅํ ๋ 2์ ๋ณด์ ํํ๋ก ์ ์ฅ
์์๋ฅผ ํํํ ๋ ๋ฌธ์ ์์
์์๋ฅผ ํํํ ๋ ๊ทธ ์์ ์ ๋๊ฐ์ ๋ถํธ๋นํธ๋ฅผ 1๋ก ์ธํ ํ ๋ค 2์ ๋ณด์๋ฅผ ์ทจํ ํํ๋ก ํํํจ
N๋นํธ ์ซ์์ ๋ํ 2์ ๋ณด์๋ 2^N ์ ๋ํ ๋ณด์๊ฐ๊ณผ ๊ฐ์ (N์ ๋ถํธ๋นํธ๋ฅผ ๋บ ๋๋จธ์ง ๊ฐ์ ํํํ ๋ ์ฌ์ฉ๋๋ ๋นํธ์ ๊ฐ์)
2์ ๋ณด์๋ฅผ ํํํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ก ํํ๋ 2์ง์๋ฅผ ๋ค์ง์ ๋ค 1์ ๋ํด ์ฃผ๋ ๊ฒ
๐ซง ์ฐ์ ์ฐ์ธก ์ํํธ VS ๋ ผ๋ฆฌ ์ฐ์ธก ์ํํธ
- ์ฐ์ ์ฐ์ธก ์ํํธ
- ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ก ๋๋ ๊ฒฐ๊ณผ์ ๊ฐ์
- ๋
ผ๋ฆฌ ์ฐ์ธก ์ํํธ
- ์ผ๋ฐ์ ์ผ๋ก ๋นํธ๋ฅผ ์ฎ๊ธธ ๋ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ์์ง์
- ๋นํธ๋ฅผ ์์ผ๋ก ์ฎ๊ธด ๋ค์์ ์ต์์ ๋นํธ์ 0์ ๋ฃ๋๋ค (ยป> ์ฐ์ฐ)
- ๋นํธ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธฐ๊ธด ํ์ง๋ง ๋ถํธ๋นํธ๋ ๋ฐ๊พธ์ง ์๋๋ค
๐ซง ๊ธฐ๋ณธ์ ์ธ ๋นํธ ์กฐ์ : ๋นํธ๊ฐ ํ์ธ ๋ฐ ์ฑ์๋ฃ๊ธฐ
- ๐ ๋นํธ๊ฐ ํ์ธ
1 ์ i ๋นํธ๋งํผ ์ํํธ์์ 00010000์ ๊ฐ์ ๊ฐ ๋ง๋ค๊ธฐ
AND ์ฐ์ฐ์ ํตํด num ์ i๋ฒ์งธ ๋นํธ๋ฅผ ๋บ ๋๋จธ์ง ๋นํธ๋ฅผ ๋ชจ๋ ์ญ์ ํ ๋ค, ์ด ๊ฐ์ 0๊ณผ ๋น๊ต
์ด ๊ฐ์ด 0์ด ์๋๋ผ๋ฉด i๋ฒ์งธ ๋นํธ๋ 1, 0์ด๋ผ๋ฉด i๋ฒ์งธ ๋นํธ๋ 0์ด์ด์ผ ํจ
1
2
3
boolean getBit(int num, int i) {
return ((num % (1 << i)) != );
}
- ๐งก ๋นํธ๊ฐ ์ฑ์๋ฃ๊ธฐ
1์ i๋นํธ๋งํผ ์ํํธํด์ 00010000์ ๊ฐ์ ๊ฐ ๋ง๋ค๊ธฐ
OR ์ฐ์ฐ์ ํตํด num์ i๋ฒ์งธ ๋นํธ๊ฐ ๋ฐ๊พธ๊ธฐ
i๋ฒ์งธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋นํธ๋ค์ 0๊ณผ OR ์ฐ์ฐ์ ํ๋ฏ๋ก num์ ์ํฅ ์์
1
2
3
int setBit(int num, int i) {
return num | (1 << i);
}
- ๐ ๋นํธ๊ฐ ์ญ์ ํ๊ธฐ
NOT ์ฐ์ฐ์๋ฅผ ์ด์ฉํด 00010000 ์ 11101111 ์ ๊ฐ์ด ๋ง๋ ๋ค num๊ณผ AND ์ฐ์ฐ
๋๋จธ์ง ๋นํธ์ ๊ฐ์ ๋ณํ์ง ์์ ์ฑ i ๋ฒ์งธ ๋นํธ๊ฐ๋ง ์ญ์ ๋จ
1
2
3
4
int clearBit(int num, int i) {
int mask = ~(1 << i);
return num & mask;
}
- : ์ต์์ ๋นํธ์์ i๋ฒ์งธ ๋นํธ๊น์ง ๋ชจ๋ ์ญ์ ํ๋ ค๋ฉด (1 ยซย i) ๋ก i๋ฒ์งธ ๋นํธ๋ฅผ 1๋ก ์ธํ ํ ๋ค ์ด ๊ฐ์์ 1์ ๋บ๋ค
i๋ฒ์งธ ๋นํธ ๋ฐ์ ๋ชจ๋ 1๋ก ์ธํ ๋๊ณ ๊ทธ ์๋ก๋ ๋ชจ๋ 0์ผ๋ก ์ธํ
mask ๊ฐ๊ณผ num์ AND ์ฐ์ฐํ๋ค๋ฉด ํ์ i๊ฐ์ ๋นํธ๋ฅผ ๋บ ๋๋จธ์ง ๋นํธ๋ฅผ ๋ชจ๋ ์ญ์ ํ ์ ์์
1
2
3
4
int clearBitMSBthroughI(int num, int i) {
int mask = (1 << i) - 1;
return num & mask;
}
- : i ๋ฒ์งธ ๋นํธ์์ 0๋ฒ์งธ ๋นํธ๊น์ง ๋ชจ๋ ์ญ์ ํ๋ ค๋ฉด ๋ชจ๋ ๋นํธ๊ฐ 1๋ก ์ธํ ๋ -1์ ์ผ์ชฝ์ผ๋ก i + 1๋งํผ ์ํํธ ํ๋ค
i๋ฒ์งธ ๋นํธ ์๋ก๋ ๋ชจ๋ 1๋ก ์ธํ ๋๊ณ ํ์ i๊ฐ ๋นํธ๋ ๋ชจ๋ 0์ผ๋ก ์ธํ ๋จ
1
2
3
4
int clearBitsIthrough0(int num, int i) {
int mask = (-1 << (i + 1));
return num & mask;
}
- ๐ ๋นํธ๊ฐ ๋ฐ๊พธ๊ธฐ
i๋ฒ์งธ ๋นํธ๊ฐ์ v๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์ฐ์ 11101111์ ๊ฐ์ ๊ฐ์ ์ด์ฉํด i๋ฒ์งธ ๋นํธ๊ฐ์ ์ญ์ ํด์ผ ํจ
๋ฐ๊พธ๊ณ ์ ํ๋ ๊ฐ v๋ฅผ ์ผ์ชฝ์ผ๋ก i๋ฒ ์ํํธ ํ๋ค
i๋ฒ์งธ ๋นํธ๊ฐ์ v๊ฐ ๋ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ 0์ด ๋ ๊ฒ์ด๋ค
๋ง์ง๋ง์ผ๋ก OR ์ฐ์ฐ์ ์ด์ฉํด i๋ฒ์งธ ๋นํธ๊ฐ์ v๋ก ๋ฐ๊ฟ์ค๋ค
1
2
3
4
5
int updateBit(int num, int i, boolean bitIs1) {
int value - bitIs1 ? 1 : 0;
int mask = ~(1 << i);
return (num & mask) | (value << i);
}
๐ซง 2์ ๋ณด์, ์์
: ์ปดํจํฐ๊ฐ ์ ์๋ฅผ ์ ์ฅํ ๋๋ ๋๋ถ๋ถ 2์ ๋ณด์ ํํ๋ก ์ ์ฅ
์์๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์๋ ๊ธฐ์กด์ ์์์ ๋นํธ๋ฅผ ๋ค์ง์ ๋ค์(1์ ๋ณด์) 1์ ๋ํด์ฃผ๋ฉด ๋๋๋ฐ, ์ด๋ ๊ธฐ์กด์ ์๋ฅผ 2์ ๋ณด์ ํํ์ ์ด์ฉํด์ ์์๋ก ๋ํ๋ธ ๊ฒ
๐ซง ์ฐ์ ์ํํธ, ๋ ผ๋ฆฌ ์ํํธ
: ๋นํธ๋ฅผ 1bit์ฉ ๋ฐ๋ฉด์ ์๊ธด ๋น์๋ฆฌ์ ์๋ก์ด bit๋ฅผ ์ฑ์์ฃผ๋ ์ฐ์ฐ
- ์ฐ์ ์ํํธ ์ฐ์ฐ
- ๋ถํธ๋นํธ๋ฅผ ๊ทธ๋๋ก ์ฑ์์ค๋ค
- ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ก ๋๋๊ฑฐ๋ ๊ณฑํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค
- ๋
ผ๋ฆฌ ์ํํธ ์ฐ์ฐ
- ๋ถํธ๋นํธ์ 0์ ์ฑ์์ค๋ค
- ์ฐ์ ์ ์ผ๋ก๋ ๊ฑฐ์ ๊ด๊ณ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ์ซ์๊ฐ ๋ณํ
๐ซง ๊ธฐ๋ณธ ์ฐ์ฐ
- NOT [
~
] : 1์ด๋ฉด 0, 0์ด๋ฉด 1 OR [
|
] : ๋ ๊ฐ ์ค 1์ด ํ๋๋ผ๋ ์๋ค๋ฉด 1, ์๋๋ฉด 0ํฉ์งํฉ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค.
XOR [
^
] : ๋ ๊ฐ์ด ๋ค๋ฅด๋ฉด 1, ๊ฐ์ผ๋ฉด 0์ค์ ๋ก๋ XOR์ ๋ค์ด๊ฐ๋ ๊ฐ ์ค 1์ ๊ฐฏ์๊ฐ ํ์๊ฐ์ด๋ฉด 1
AND [
&
] : ๋ ๊ฐ ๋ชจ๋ 1์ด๋ผ๋ฉด 1, ์๋๋ฉด 0๊ต์งํฉ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค.
- SHIFT [
<<
ย>>
] : ๋นํธ ๋จ์๋ก ํ ์นธ์ฉ ๋ฏธ๋ ์ฐ์ฐ
๐ซง ํจ์ ๊ตฌํ
- Get : ํน์ ์์น์ ๋นํธ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- Set : ํน์ ์์น์ ๋นํธ ๊ฐ์ ์ธํ ํ๋ค.
- Count : ์ธํ ๋ ๋นํธ ๊ฐ์ด ๋ช ๊ฐ์ธ์ง ๋ฐํํ๋ค.
- Clear : ๋นํธ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ ํ๋ค.
- Toggle : ๋นํธ๋ฅผ ๋ฐ์ ์ํจ๋ค.
- MSB : ์ต์์ ๋นํธ๋ฅผ ์ฐพ๋๋ค.
- LSB : ์ตํ์ ๋นํธ๋ฅผ ์ฐพ๋๋ค.
๐ซง ๋นํธ๋ง์คํฌ(BitMask)
- : ์ฌ๋ฌ ํํ ์ ๋นํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ํจ์จ์ ์ผ๋ก ํํํ ์ ์๋ค
ex) ์งํฉ {1,2,3,5}๊ฐ ์์ ๋ 11101๋ก ๋ํ๋ผ ์ ์๊ณ ์ ์ฅํ ๋๋ 10์ง์๋ก 29๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค
๋ฐฐ์ด์ ์ด์ฉํ ํ์์์ด ์ ์ ํ๋๋ง์ผ๋ก ์ ์ฅ์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค