import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Set<Integer> set = new HashSet<>();
int N = sc.nextInt();
for (int i = 0; i < N; i++) {
int temp = sc.nextInt();
set.add(temp);
}
int M = sc.nextInt();
for (int i = 0; i < M; i++) {
int temp = sc.nextInt();
if (set.contains(temp)) {
System.out.println("1");
} else {
System.out.println("0");
}
}
}
}
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int[] A = new int[N];
for (int i = 0; i < N; i++) {
A[i] = scan.nextInt();
}
Arrays.sort(A);
int M = scan.nextInt();
for (int i = 0; i < M; i++) { //찾을 수의 개수 M 만큼 반복
boolean find = false;
int target = scan.nextInt();
int start = 0; // A배열 처음 인덱스
int end = N - 1; // A배열 마지막 인덱스
while (start <= end) { // 처음 인덱스가 마지막 인덱스와 같거나 작을때 반복
int mid = (start + end) / 2; // 중간값찾을 인덱스
if (A[mid] > target) { // 중간값이 타깃보다 크면
end = mid - 1; // end 인덱스를 중간값 찾을 인덱스보다 하나 줄여 대입
}else if (A[mid] < target) { // 중간값이 타깃보타 작으면
start = mid + 1; // start 인덱스를 중간값 찾을 인덱스보다 하나 늘려 대입
}else { // 값을 찾았을때 반복문 종료
find = true;
break;
}
}
if (find) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
}
처음에는 HashSet을 생각했다. 중복을 제거해주고 contains()메서드가 O(1)인 set이 적합할 것이라고 생각했다. 하지만 이 방법은 시간을 많이 잡아먹는다. 이진 탐색을 이용하여 푸는 것이 좀 더 효율적인 방법이다. 앞으로 데이터 탐색에는 시간복잡도가 logn인 이진탐색을 이용하자!