์ด๋ถํ์์ ํฌ๊ฒ ์กด์ฌ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ, lower bound์ upper bound๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ๋ ๊ฐ์ง๊ฐ ์๋ค.
์กด์ฌ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ๊ฒฝ์ฐ = ์ค๋ณต์์๋ฅผ ๊ณ ๋ คํ์ง ์์
lower bound์ upper bound = ์ค๋ณต์์๋ฅผ ๊ณ ๋ ค
์กด์ฌ์ฌ๋ถ ํ์ (์ค๋ณต์์ ๊ณ ๋ คํ์ง ์์)
public static int binarySearch(int[] arr, int key) {
int lo = 0; // ํ์ ๋ฒ์์ ์ผ์ชฝ ๋ ์ธ๋ฑ์ค
int hi = arr.length - 1; // ํ์ ๋ฒ์์ ์ค๋ฅธ์ชฝ ๋ ์ธ๋ฑ์ค
while(lo <= hi) {
int mid = (lo + hi) / 2;
if(key==arr[mid]){
return mid;
}
if(key < arr[mid]) {
hi = mid - 1;
}
else if(key > arr[mid]) {
lo = mid + 1;
}
}
}
์ค๋ณต์์ ๊ณ ๋ ค
lower bound
private static int lowerBound(int[] arr, int key) {
int lo = 0;
int hi = arr.length;
// lo๊ฐ hi๋ ๊ฐ์์ง ๋ ๊น์ง ๋ฐ๋ณต
while (lo < hi) {
int mid = (lo + hi) / 2; // ์ค๊ฐ์์น๋ฅผ ๊ตฌํ๋ค.
/*
* key ๊ฐ์ด ์ค๊ฐ ์์น์ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ
*
* (์ค๋ณต ์์์ ๋ํด ์ผ์ชฝ์ผ๋ก ํ์ํ๋๋ก ์๊ณ๋ฅผ ๋ด๋ฆฐ๋ค.)
*/
if (key <= arr[mid]) {
hi = mid;
}
else {
lo = mid + 1;
}
}
return lo;
}
upper bound
rivate static int upperBound(int[] arr, int key) {
int lo = 0;
int hi = arr.length;
// lo๊ฐ hi๋ ๊ฐ์์ง ๋ ๊น์ง ๋ฐ๋ณต
while (lo < hi) {
int mid = (lo + hi) / 2; // ์ค๊ฐ์์น๋ฅผ ๊ตฌํ๋ค.
// key๊ฐ์ด ์ค๊ฐ ์์น์ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ
if (key < arr[mid]) {
hi = mid;
}
// ์ค๋ณต์์์ ๊ฒฝ์ฐ else์์ ์ฒ๋ฆฌ๋๋ค.
else {
lo = mid + 1;
}
}
return lo-1;
}
์ด๋ ์ฃผ์ํ ์ ์ด upper bound๊ฐ ๋๋์ ๋ฆฌํดํ๋ ๊ฐ์ ์ค๋ณต์์ ๋ค์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๋ฐ๋ผ์ lo-1๊ฐ์ return ํจ
์ฐธ๊ณ :
https://st-lab.tistory.com/261
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ (0) | 2024.04.01 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฐฉ์ ๊ฐ์ (0) | 2024.03.29 |
visited๋ฐฐ์ด์ด 3์ฐจ์์ธ bfs ์ต๋จ๊ฒฝ๋ก ํ์ ๋ฌธ์ (๋ฐฑ์ค 1600๋ฒ) (2) | 2024.02.28 |
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2024.02.22 |
DFS + DP (๋ฐฑ์ค 1520 ๋ด๋ฆฌ๋ง๊ธธ) (0) | 2024.02.20 |