[Algorithm] ์ด์ง ํ์ ๋ฐ ๋ณํ ์๊ณ ๋ฆฌ์ฆ Binary Search Algorithm
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฐพ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด์ง ํ์์ ๊ฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ฌ๊ฐ๋ฉฐ ์ํ๋ ๊ฐ์ ์ฐพ์๋ด๋ ๋ฐฉ์์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ $O(\log n)$์ผ๋ก ํจ์จ์ ์ด๋ค. ์๋ฅผ ๋ค์ด 1024๊ฐ ์์๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์์ ์ํ๋ ๊ฐ์ ์ฐพ์ ๋ ์ต๋ 10๋ฒ์ ๋น๊ต๋ง ํ์ํ๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ค๋ฉด ๋งค๋ฒ ์ ๋ ฌ์ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ด ๋จ์ด์ง ์ ์๋ค. ๋ฐ์ดํฐ ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ์ ํด์ ํ ์ด๋ธ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ ๋์ ์ ์๋ค.
๐ก ์ด์ง ํ์์ ์ด๋ถ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
์ด์ง ํ์ ๊ธฐ๋ณธ

- ์ค์๊ฐ ๊ณ์ฐ
- ๋ฐฐ์ด์ ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ค
mid = Math.floor((left + right) / 2) - ์ค์๊ฐ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๊ฐ(target)์ ๋น๊ตํ๋ค
- ๋ฐฐ์ด์ ์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ค
- ๊ฐ ๋น๊ต ๋ฐ ๋ฒ์ ์กฐ์
- ๋ฐ๋ณต ์ข
๋ฃ
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๊ณผ ๊ฐ๋ค๋ฉด ํ์์ ์ข ๋ฃํ๊ณ ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค
- ๋ ์ด์ ํ์ ๋ฒ์๊ฐ ์์ผ๋ฉด(left > right) ๋ฐ๋ณต์ ์ข
๋ฃํ๊ณ
-1์ ๋ฐํํ๋ค
- ๊ณ์ ๋ฐ๋ณต
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด, ํ์ ๋ฒ์๋ฅผ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค
left = mid + 1 - ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด, ํ์ ๋ฒ์๋ฅผ ์ผ์ชฝ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค
right = mid - 1
- ์ค์๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด, ํ์ ๋ฒ์๋ฅผ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค
- ๋ฐ๋ณต ์ข
๋ฃ
๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ โผ
const binarySearch = (sortedArr, target) => {
let left = 0;
let right = sortedArr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2); // ์ค์ ์ธ๋ฑ์ค ๊ณ์ฐ
if (sortedArr[mid] === target) return mid; // ์ํ๋ ๊ฐ์ ์ฐพ์์ ๋
if (sortedArr[mid] < target) left = mid + 1; // ํ์ ๋ฒ์ ์ค๋ฅธ์ชฝ ์ ๋ฐ์ผ๋ก ์ถ์
else right = mid - 1; // ํ์ ๋ฒ์ ์ผ์ชฝ ์ ๋ฐ์ผ๋ก ์ถ์
}
return -1; // ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๋
};
์ด์ง ํ์ ์์ฉ
๐ก bisect๋ “์ด๋ฑ๋ถํ๋ค”๋ผ๋ ๋ป์ผ๋ก ์ด๋ค ๊ฒ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์ด์ฌ์์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด bisect๋ผ๋ ๋ชจ๋์ ์ ๊ณตํ๋ค. ์ด ๋ชจ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋ ์์น๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉํ๋ bisect_left, bisect_right ํจ์๊ฐ ํฌํจ๋์ด ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด์ง ํ์ ๋ก์ง์ ์ด์ง๋ง ๋ณํํด์ ๋์ผํ๊ฒ ๊ตฌํํ ์ ์๋ค.

bisect_left (์ข์ธก ์ด๋ถ ํ์)
์ ๋ ฌ๋ ๋ฐฐ์ด์์ target์ ์ฝ์
ํ ์ ์๋ ๊ฐ์ฅ ์ผ์ชฝ ์์น(์ธ๋ฑ์ค)๋ฅผ ๋ฐํํ๋ค. target๊ณผ ๋์ผํ ๊ฐ์ด 1๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ target์ ์์น๋ฅผ ๋ฐํํ๋ค. target๊ณผ ๋์ผํ ๊ฐ์ด ์๋ค๋ฉด, target๋ณด๋ค ํฐ ๊ฐ์ด ์ฒ์ ๋ํ๋ ์์น๋ฅผ ๋ฐํํ๋ค.
const bisectLeft = (sortedArr, target) => {
let left = 0;
let right = sortedArr.length;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (sortedArr[mid] < target) left = mid + 1;
else right = mid;
}
return left;
};
const arr = [1, 2, 4, 4, 6];
console.log(bisectLeft(arr, 4)); // 2
console.log(bisectLeft(arr, 3)); // 2
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด๋ผ๋ฉด bisect_left ํจ์๊ฐ ๋ฐํํ ์ธ๋ฑ์ค ์ดํ์ ์๋ ์์๋ค์ ๋ชจ๋ target๊ณผ ๊ฐ๊ฑฐ๋ ํฌ๋ค๊ณ ๋ณผ ์ ์๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด์์ target๊ณผ ๊ฐ๊ฑฐ๋ ํฐ ์์์ ๋ชจ๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
const countGreaterOrEqual = (sortedArr, target) => {
const leftIndex = bisectLeft(sortedArr, target);
return sortedArr.length - leftIndex; // target๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์์ ์
};
const arr = [1, 2, 4, 4, 6];
console.log(countGreaterOrEqual(arr, 4)); // 3

bisect_right (์ฐ์ธก ์ด๋ถ ํ์)
์ ๋ ฌ๋ ๋ฐฐ์ด์์ target์ ์ฝ์
ํ ์ ์๋ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์์น(์ธ๋ฑ์ค)๋ฅผ ๋ฐํํ๋ค. target๊ณผ ๋์ผํ ๊ฐ์ด 1๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ๋ฉด, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ target์ ๋ค์ ์์น๋ฅผ ๋ฐํํ๋ค. target๊ณผ ๋์ผํ ๊ฐ์ด ์๋ค๋ฉด, target๋ณด๋ค ํฐ ๊ฐ์ด ์ฒ์ ๋ํ๋ ์์น๋ฅผ ๋ฐํํ๋ค.
const bisectRight = (sortedArr, target) => {
let left = 0;
let right = sortedArr.length;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (sortedArr[mid] <= target) left = mid + 1;
else right = mid;
}
return left;
};
const arr = [1, 2, 4, 4, 6];
console.log(bisectRight(arr, 4)); // 4
console.log(bisectRight(arr, 3)); // 2
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด๋ผ๋ฉด bisect_right ํจ์๊ฐ ๋ฐํํ ์ธ๋ฑ์ค ์ด์ ์ ์๋ ์์๋ค์ ๋ชจ๋ target๊ณผ ๊ฐ๊ฑฐ๋ ์๋ค. ์๋ฅผ ๋ค์ด bisect_right๊ฐ 4๋ฅผ ๋ฐํํ๋ค๋ฉด 0~3 ์ธ๋ฑ์ค์ ์๋ ์์๋ target๊ณผ ๊ฐ๊ฑฐ๋ ์์ ๊ฐ๋ค์ด๋ค. ๋ฐ๋ผ์ bisect_right๊ฐ ๋ฐํํ๋ ์ธ๋ฑ์ค๋ ๊ณง target๊ณผ ๊ฐ๊ฑฐ๋ ์์ ์์์ ๊ฐ์์ ๊ฐ๋ค.
const countLessOrEqual = (sortedArr, target) => {
return bisectRight(sortedArr, target);
};
const arr = [1, 2, 4, 4, 6];
console.log(countLessOrEqual(arr, 4)); // 4

๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[DevTools] nvm๋ณด๋ค 40๋ฐฐ ๋น ๋ฅธ ๋ ธ๋ ๋ฒ์ ๊ด๋ฆฌ ๋๊ตฌ — fnm
[DevTools] nvm๋ณด๋ค 40๋ฐฐ ๋น ๋ฅธ ๋ ธ๋ ๋ฒ์ ๊ด๋ฆฌ ๋๊ตฌ — fnm
2024.06.18 -
[DevTools] Prettier ์ฃผ์ ํฌ๋งทํ ์ต์ ๊ณผ ์ถ์ฒ ์ค์
[DevTools] Prettier ์ฃผ์ ํฌ๋งทํ ์ต์ ๊ณผ ์ถ์ฒ ์ค์
2024.06.15 -
[Network] ์ฃ์ง ํ๋ซํผ ์ํคํ ์ฒ Edge Platform Architecture
[Network] ์ฃ์ง ํ๋ซํผ ์ํคํ ์ฒ Edge Platform Architecture
2024.06.02 -
[HTML/CSS] ์ํ๋ ์์น์ ๋ ธ๋ ์ฝ์ ํ๊ธฐ — insertAdjacentHTML
[HTML/CSS] ์ํ๋ ์์น์ ๋ ธ๋ ์ฝ์ ํ๊ธฐ — insertAdjacentHTML
2024.06.02