# 문제 설명
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.
출력
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.
# 정답 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken()); //숫자 카드의 개수
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int n = 0; n < N; n++) {
arr[n] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr); //오름차순 정렬
st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()); //같은지 구해야할 숫자의 개수
st = new StringTokenizer(br.readLine());
for (int m = 0; m < M; m++) {
int target = Integer.parseInt(st.nextToken());
boolean find = false;
int start = 0;
int end = N-1;
while (start <= end) {
int midIdx = (start + end) / 2;
int midVal = arr[midIdx];
if (target < midVal) {
end = midIdx-1;
}
else if (midVal < target) {
start = midIdx+1;
}
else {
find = true;
break;
}
}
if (find) {
sb.append("1 ");
}
else {
sb.append("0 ");
}
}
System.out.print(sb);
}
}
M개의 수가 배열에 있는 데이터이면 1을, 없는 데이터이면 0을 출력하는 문제이다.
이진 탐색을 이용하여 타깃 데이터를 찾았다.
크기가 N인 배열을 만들어 데이터를 입력받는다.
이진 탐색을 사용하기 위해 오름차순 정렬한다.
그 다음 M번만큼 반복하며 답을 구한다.
target에 타깃 데이터의 값을 입력받는다.
타깃 데이터를 찾았는지 체크할 find를 만든다.
이진 탐색 데이터셋을 설정할 start와 end를 각각 0, N-1로 설정한다.
start가 end보다 작거나 같을 때까지 반복하며 이진 탐색을 실행한다.
- 타깃 데이터 < 중앙값이면 end를 midIdx-1로 설정한다.
- 중앙값 < 타깃 데이터이면 start를 midIdx+1로 설정한다.
- 중앙값 == 타깃 데이터이면 find를 true로 설정하고 while문을 종료한다.
find가 true이면 1을 출력하고 false이면 0을 출력한다.
'백준' 카테고리의 다른 글
[2343] 기타 레슨 (JAVA) (0) | 2024.03.30 |
---|---|
[1920] 수 찾기 (JAVA) (0) | 2024.03.30 |
[11724] 연결 요소의 개수 (JAVA) (0) | 2024.03.29 |
[2606] 바이러스 (JAVA) (0) | 2024.03.29 |
[10989] 수 정렬하기 3 (JAVA) (0) | 2024.03.28 |