이진 탐색 (binary search) 기반
의 탐색 방법입니다. (단, 배열 또는 리스트가 오름차순으로 정렬
되어있어야 합니다.)찾으려는 key값보다 같거나 큰 숫자
가 배열 몇 번째에서 처음 등장
하는지 찾기 위함입니다. (인덱스를 반환)#include <iostream>
#include <algorithm>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int a[10] = {1, 3, 4, 6, 7, 9, 11, 13, 19, 20};
cout << lower_bound(a, a+10, 6) - a << endl; // 6이 위치한 인덱스인 "3" 반환
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
vector<int> v = {1, 3, 4, 6, 7, 9, 11, 13, 19, 20};
cout << lower_bound(v.begin(), v.end(), 6) - v.begin() << endl; // 6이 위치한 인덱스인 "3" 반환
return 0;
}
이진 탐색 (binary search) 기반
의 탐색 방법입니다. (단, 배열 또는 리스트가 오름차순으로 정렬
되어있어야 합니다.)찾으려는 key값을 초과하는 숫자
가 배열 몇 번째에서 처음 등장
하는지 찾기 위함입니다. (인덱스를 반환)#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
vector<int> v = {1, 3, 4, 6, 7, 9, 11, 13, 19, 20};
cout << upper_bound(v.begin(), v.end(), 6) - v.begin() << endl; // 7이 위치한 인덱스인 "4" 반환
return 0;
}
시간복잡도 O(logN)으로 탐색
하여 O(N)이 불가능한 경우에 유용하게 쓰일 수 있습니다.#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
vector<int> v = {1, 3, 4, 6, 7, 9, 11, 13, 19, 20};
cout << upper_bound(v.begin(), v.end(), 11) - lower_bound(v.begin(), v.end(), 6) << endl; // 4 출력
return 0;
}
[Reference]