본문 바로가기
IT/알고리즘 및 자료구조

[알고리즘 정리] 이분 탐색

by 빨강자몽 2018. 9. 14.

이분 탐색


시간 복잡도 : Log(N)


left : 값의 범위중 가장 작은 값

right : 값의 범위중 가장 큰 값

mid : (left + right) / 2

target : 찾으려는 값


ex) 1~100 사이의 5개의 값 1, 11, 21, 31, 99 중에서 31이 있나 찾자!

left : 1, right : 100, mid : 50, target : 31


기본 코드


while (left <= right)
{
    mid = (left + right) / 2;
    if (arr[mid] == target)
        return mid;
    else if (arr[mid] > target)
        right = mid - 1;
    else
        left = mid + 1;
}


기본 예제


https://www.acmicpc.net/problem/1920


#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #define MAX 200005 #define INF 987654321 #define MOD 31991 #pragma warning(disable:4996) using namespace std; typedef long long ll; typedef pair<int, int> pi; int n, m, tmp, lft, mid, rht; int arr[100005]; int finder(int dest) { while (lft<=rht) { mid = (lft + rht) / 2; if (arr[mid] == dest) return 1; else if (arr[mid] < dest) lft = mid + 1; else rht = mid - 1; } return 0; } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &arr[i]); scanf("%d", &m); sort(arr, arr + n); for (int i = 0; i < m; i++) { lft = 0, rht = n - 1; mid = (lft+rht)/2; scanf("%d", &tmp); int ans=finder(tmp); if (ans) printf("1\n"); else printf("0\n"); } return 0; }