가장 기본적인 이분탐색 방법입니다...
본인의 머리속에서 떠오르는데로 짜고 다른분들의 코드를 보니
종료시점에서 찾고자 하는수를 찾지 못한 조건을
left>=right로 주는 것이 정석적인 방법인거 같다.
이하 생략~
#include <iostream> #include <algorithm> #include <vector> #include <string.h> #include <math.h> #include <queue> #include <set> #include <utility> #include <functional> #define MAX 40005 #define MOD 1000000007 #pragma warning(disable:4996) using namespace std; int n, m, tmp, lft, mid, rht; int map[100005]; int finder(int dest) { while (1) { if (map[mid] == dest) return 1; // 만약 찾고자하는 값을 찾은경우 else if (map[mid] < dest) { lft = mid + 1; mid = (lft + rht) / 2; } // 찾지 못하였지만 찾고자 하는값이 중간값보다 작은 경우 else { rht = mid - 1; mid = (lft + rht) / 2; } // 찾지 못하였지만 찾고자 하는값이 중간값보다 큰 경우 if (dest < map[lft] || map[rht] < dest) return 0; // 이분 탐색을 처음으로 생각하여 종료시점을 이렇게 설정하고 풀었다. // 다른 분들은 보통 lft>=right를 조건으로 두셨다. } } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &map[i]); scanf("%d", &m); sort(map, map + 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; }
'IT > BOJ' 카테고리의 다른 글
백준(BOJ) 11505 구간 곱 구하기 * (0) | 2018.06.01 |
---|---|
백준(BOJ) 2336 굉장한 학생 *** (0) | 2018.06.01 |
백준(BOJ) 10815 숫자 카드 * (0) | 2018.06.01 |
백준(BOJ) 7453 합이 0인 네 정수 * (0) | 2018.06.01 |
백준(BOJ) 1931 회의실배정 ** (0) | 2018.06.01 |