알고리즘/탐색

이진 탐색

sim0609 2023. 2. 21. 23:10

이진 탐색은 데이터가 정렬된 상태에서 원하는 값을 찾아내는 알고리즘이다.

개상 데이터의 중간값과 찾고자 하는 값을 비교해 데이터의 크기를 절반씩 줄이면서 대상을 찾는게 핵심이다.

 

이진 탐색은 주로 정렬 데이터에서 원하는 데이터를 탐색할 때 사용하는 알고리즘임을 알아두자.

 

이진 탐색 과정

1. 현재 데이터셋의 중앙값을 선택

2. 중앙값 > 타깃 데이터일 때 중앙값 기준으로 왼쪽 데이터셋을 선택

3. 중앙값 < 타깃 데이터일 때 중앙값 기준으로 오른쪽 데이터셋을 선택

4. 과정 1~3을 반복하다가 중앙값 == 타깃 데이터일 때 탐색 종료

 

백준 - 1920: 트리의 지름 구하기

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

나의 코드(오류 수정 & 피드백)

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

static vector <int> num;
// static vector <int> num_f;

int main() {

	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int n, n_f, num_f;
	int n1, n2;

	cin >> n;
	num.resize(n + 1);

	for (int i = 1; i <= n; i++) {
		cin >> n1;
		num[i] = n1;
	}

	sort(num.begin(), num.end());

	cin >> n_f;

	for(int i = 1; i <= n_f; i++) {

		cin >> num_f;
		bool find = false;
		int s = 1, e = n;
		int mid = (n + s) / 2;

		while(s <= e) {

			mid = (s + e) / 2;

			if (num_f > num[mid]) { // 중앙값 < 타깃 데이터

				s = mid + 1;

			}

			else if (num_f < num[mid]) { // 중앙값 > 타깃 데이터

				e = mid - 1;
			
			}

			else { // 중앙값 == 타깃 데이터
				find = true;
				break;
			}

		}
		if (find == true) {
			cout << '1' << endl;
		}
		else {
			cout << '0' << endl;
		}
	}

}