반응형
#include <bits/stdc++.h>
using namespace std;
/**
* @brief ans 변수를 사용하는 lower_bound
* @param arr 오름차순 정렬된 배열
* @param val 찾고자 하는 값
* @return arr 내에서 (arr[idx] >= val)을 만족하는 가장 작은 idx
* (없으면 arr.size() 리턴)
*/
int my_lower_bound_ans(const vector<int>& arr, int val) {
int l = 0;
int r = (int)arr.size() - 1;
int ans = (int)arr.size(); // 없을 경우 기본값
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] >= val) {
ans = mid; // 조건 만족 → 더 왼쪽도 탐색해 봄
r = mid - 1;
} else {
// arr[mid] < val → 더 오른쪽에서 찾음
l = mid + 1;
}
}
return ans;
}
/**
* @brief ans 변수를 사용하는 upper_bound
* @param arr 오름차순 정렬된 배열
* @param val 찾고자 하는 값
* @return arr 내에서 (arr[idx] > val)을 만족하는 가장 작은 idx
* (없으면 arr.size() 리턴)
*/
int my_upper_bound_ans(const vector<int>& arr, int val) {
int l = 0;
int r = (int)arr.size() - 1;
int ans = (int)arr.size();
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] > val) {
ans = mid; // 조건 만족 → 더 왼쪽도 탐색
r = mid - 1;
} else {
// arr[mid] <= val → 더 오른쪽에서 찾음
l = mid + 1;
}
}
return ans;
}
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
vector<int> arr = {1, 2, 4, 4, 4, 6, 7, 8, 8, 10};
int val = 4;
int lb_ans = my_lower_bound_ans(arr, val);
int ub_ans = my_upper_bound_ans(arr, val);
cout << "[ans 방식]\n";
cout << "lower_bound for " << val << " = " << lb_ans << "\n";
cout << "upper_bound for " << val << " = " << ub_ans << "\n";
return 0;
}
반응형
'알고리즘 > 코드' 카테고리의 다른 글
C++ Trie(트라이) 코드 (0) | 2025.02.13 |
---|---|
크루스칼,프림 알고리즘 C++ 코드 (1) | 2025.02.07 |
Union-Find C++ 코드 (0) | 2025.02.05 |
CCW (Counter ClockWise) C++ 코드 (1) | 2024.11.28 |
벨만포드 C++ 코드 (0) | 2024.11.06 |