데이터가 정렬되어 있는 상태에서 원하는 값을 찾아내는 알고리즘입니다. 대상 데이터의 중간값과 찾고자 하는 값을 비교하여 데이터의 크기를 절반씩 줄이면서 대상을 찾습니다.
이분 탐색 문제의 경우, 실제 살짝만 꼬아도 너무 어렵기 때문에 당장에는 기본적인 로직을 구현할 정도만 익혀둔 뒤 추후 활용문제들을 집중적으로 풀어 익숙해져야 합니다.
핵심이론
1. 오름차순 정렬
2. 중앙값 > 타깃 데이터인 경우, 중앙값 기준 왼쪽 데이터셋을 선택
3. 중앙값 < 타깃 데이터인 경우, 중앙값 기준 오른쪽 데이터셋을 선택
4. 1~3 과정을 반복하다가 중앙값 == 타깃 데이터일 때 탐색 종료
import java.io.*;
import java.util.*;
public class Main{
static int[] a;
static int n;
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
a = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i < n; i++){
a[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(a);
int m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
br.close();
StringBuilder sb = new StringBuilder();
for(int i=0; i<m; i++){
int target = Integer.parseInt(st.nextToken());
if(binarySearch(target)){
sb.append(1).append("\n");
}
else{
sb.append(0).append("\n");
}
}
System.out.println(sb);
}
static boolean binarySearch(int target){
int start = 0;
int end = n-1;
while(start <= end){
int half = (start + end) / 2;
if(a[half] > target){
end = half-1;
}
else if(a[half] < target){
start = half+1;
}
else{
return true;
}
}
return false;
}
}