이진 탐색
이진 탐색은 정렬된 데이터 집합에서 사용할 수 있는 고속 탐색 알고리즘중 하나이다.
이진 탐색 순서
- 데이터 집합의 중앙에 있는 요소를 선택한다.
- 중앙 요소의 값과 찾고자 하는 목표 값을 비교한다.
- 중앙 요소값보다 작으면 중앙 기준으로 왼쪽, 그 반대면 오른쪽을 재 탐색한다.
- 데이터 집합의 마지막 인덱스까지 1~3번을 반복한다.
코드
백준에 있는 다음 문제를 이진 탐색으로 풀었다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void Input(int& v) { cin >> v; }
void Output(int& v) { cout << v << ' '; }
bool BinarySearch(vector<int>& Base, int Target);
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n = 0; // 상근이가 가지고 있는 카드의 수
int m = 0; // 숫자 카드에 적혀있는 수
// 상근이 카드 입력 받기
cin >> n;
vector<int> card(n);
for_each(card.begin(), card.end(), Input);
// 숫자 카드에 적혀 있는 수 입력 받기
cin >> m;
vector<int> demo(m);
for_each(demo.begin(), demo.end(), Input);
// 탐색 전 오름차순 정렬
sort(card.begin(), card.end(), less<>());
// 이진 탐색으로 값 찾기
for (int i = 0; i < demo.size(); i++)
cout << BinarySearch(card, demo[i]) << ' ';
return 0;
}
bool BinarySearch(vector<int>& Base, int Target)
{
int left = 0, mid = 0, right = 0;
left = 0;
right = Base.size() - 1;
while (left <= right)
{
mid = (left + right) / 2;
if (Target == Base[mid])
return true;
else if (Target < Base[mid])
right = mid - 1;
else
left = mid + 1;
}
return false;
}
'과거 자료' 카테고리의 다른 글
main 함수에서 argc, argv 의미 (0) | 2022.09.05 |
---|---|
[#3] header <algorithm> - lower_bound, upper_bound (0) | 2022.09.02 |
[#3] STL :: iterator (이터레이터), for_each, istream_iterator, ostream_iterator (0) | 2022.08.29 |
[#2] header <algorithm> - sort 함수 (0) | 2022.08.28 |
[#2] STL :: Vector Template Class (0) | 2022.08.25 |