Competition/Baekjoon
[백준] 10815번 자바 숫자카드
bisi
2020. 3. 31. 02:25
문제 출처
https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다. 셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이
www.acmicpc.net
접근 방식 및 풀이
- 이분탐색의 기초문제
- 시간초과가 안걸리는게 목표!
- HashSet으로도 구현할 수 있지만 이분탐색을 활용해보자~
소스 코드
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
long[] arra = new long[a];
for (int i = 0; i <a ; i++) {
arra[i] =sc.nextLong();
}
int b = sc.nextInt();
long[] arrb = new long[b];
for (int i = 0; i <b ; i++) {
arrb[i] =sc.nextLong();
}
Arrays.sort(arra);
int ans =0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <b ; i++) {
int left = 0;
int right= a-1;
long val = arrb[i];
int mid =0;
// System.out.println("----- " + val);
while(left<=right){
mid =(left+right)/2;
// System.out.println("mid "+ mid + " arra[mid] " + arra[mid] + " val " + val);
if(arra[mid]>val){
right = mid-1;
ans = 0;
}else if(arra[mid]<val) {
left = mid+1;
ans = 0;
}else{
ans = 1;
break;
}
}
sb.append(ans+" ");
}
System.out.print(sb);
}
}
결과