이진 탐색이 정렬된 데이터에서 찾고자 하는 target data가 있는지 검색하는 알고리즘이라면, lower bound와 upper bound는 target data의 하한선 위치와 상한선 위치를 찾을 수 있는 알고리즘이다.
target data의 개수 = upper bound - lower bound
이진 탐색을 기반으로 동작하기 때문에 시간 복잡도는 O(logN)이며 정렬된 데이터에서 사용할 수 있는 기법이다.
lower bound : target data와 같거나 큰 데이터가 처음 나온 위치를 반환 (하한선)
upper bound : target data보다 큰 데이터가 처음 나온 위치를 반환 (상한선)
target data와 같은 원소 혹은 큰 원소가 최초로 나온 지점의 위치를 반환



#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <math.h>
using namespace std;
int main(void)
{
int arr[] = { 1,2,2,3,3,3,4,6,7 };
int st = 0;
int en = 9;
int mid;
int target = 3;
// 숫자 3의 lower bound 구현 -> 결과 : 3
while (st < en)
{
mid = (st + en) / 2;
if (arr[mid] < target) // 현위치가 target보다 작음 -> 왼쪽 원소들과 현위치는 검사할 필요도 없음
{
st = mid + 1;
}
else // arr[mid] >= target (lower bound의 후보군이 되는 위치임)
{
en = mid;
}
}
printf("target = %d의 lower bound는 %d입니다\n", target, en);
}
arr = [1,2,2,3,3,3,4,6,7]
st = 0
en = 9
target = 3
while (st < en):
mid = (st + en) // 2
if (arr[mid] < target):
st = mid + 1
else: #arr[mid] >= target
en = mid
print(target, "의 lower bound는", en, "입니다")
target data보다 큰 원소가 최초로 나온 지점의 위치를 반환



#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <math.h>
using namespace std;
int main(void)
{
int arr[] = { 1,2,2,3,3,3,4,6,7 };
int st = 0;
int en = 9;
int mid;
int target = 3;
// 숫자 3의 upper bound 구현 -> 결과 : 6
while (st < en)
{
mid = (st + en) / 2;
if (arr[mid] <= target) // 현위치가 target보다 작음 -> 후보군도 아님 -> 왼쪽 원소들과 현위치는 검사할 필요도 없음
{
st = mid + 1;
}
else // arr[mid] > target (upper bound의 후보군이 되는 위치임)
{
en = mid;
}
}
printf("target = %d의 lower bound는 %d입니다\n", target, en);
}
arr = [1,2,2,3,3,3,4,6,7]
st = 0
en = 9
target = 3
while (st < en):
mid = (st + en) // 2
if (arr[mid] <= target):
st = mid + 1
else: #arr[mid] > target
en = mid
print(target, "의 upper bound는", en, "입니다")
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!