Level-Up/알고리즘
[백준] 10815. 숫자 카드 - 실버4
김시기
2021. 8. 25. 18:53
https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
문제 요약
상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀 있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.
문제 해결 아이디어
간단하게 이진 탐색으로 풀었는데 속도가 많이 나왔다. 속도를 줄일 수 있는 아이디어를 얻어야 할듯...
완성된 코드
package week3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_BOJ_10815_숫자카드 {
static int[] cards;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
cards = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
cards[i] = Integer.parseInt(st.nextToken());
}
int M = Integer.parseInt(br.readLine());
Arrays.sort(cards);
int key = 0;
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < M; i++) {
key = Integer.parseInt(st.nextToken());
search(key);
}
}
public static void search(int key) {
int start = 0, end = cards.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (cards[mid] == key) {
System.out.print("1 ");
return;
} else if (cards[mid] < key) {
start = mid + 1;
} else {
end = mid - 1;
}
}
// 못찾았다면
System.out.print("0 ");
}
}