Jun's Development Journey

[Algorithm] 이진 탐색 기법 설명 및 활용 본문

Algorithm/Binary Search

[Algorithm] 이진 탐색 기법 설명 및 활용

J_Jayce 2021. 3. 1. 17:56

1. 이진 탐색(Binary Search)

- 정렬 등과 함께 가장 기초인 알고리즘이다.

- 검색 범위를 줄여 나가면서 원하는 데이터를 감색하는 알고리즘

- 순차 탐색에 비해 굉장히 빠르지만, 데이터가 미리 정렬이 되어 있어야 한다.

 

 

2. 예시 문제

문제)

www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

풀이)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_1 {
	
	public static boolean binary_search(int[] arr, int n) {
		int start = 0, end = arr.length-1;
		int mid;
		while(start<=end) {
			mid = (start+end)/2;
			if(arr[mid] == n)
				return true;
			else if(arr[mid]<n) {
				start = mid+1;
			}
			else {
				end = mid-1;
			}
		}
		return false;
	}
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		//선언 및 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(br.readLine());
		int[] sang = new int[N];
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<N;i++)
			sang[i] = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(br.readLine());
		int[] card = new int[M];
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<M;i++)
			card[i] = Integer.parseInt(st.nextToken());
		
		Arrays.sort(sang);
		//계산
		for(int n : card) {
			if(binary_search(sang,n))
				sb.append("1 ");
			else
				sb.append("0 ");
		}
		System.out.println(sb);
	}

}