👀 문제
https://www.acmicpc.net/problem/1920
👊 도전
1. 설계
- n개의 정수를 array에 저장한 후, 이분 탐색을 위해 오름차순 정렬한다.
- m개의 수는 input에 저장하여 이분 탐색을 통해 array에 값이 있는지 확인한다.
2. 구현 (성공 코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.Arrays;
import java.util.Scanner;
/**
* @author HEESOO
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int[] array=new int[n];
for(int i=0;i<n;i++)
array[i]=scan.nextInt();
Arrays.sort(array);
int m=scan.nextInt();
int[] input=new int[m];
for(int i=0;i<m;i++)
input[i]=scan.nextInt();
for(int i=0;i<m;i++) {
int first=0;
int last=n-1;
int mid=0;
while(first<=last) {
mid=(first+last)/2;
if(input[i]==array[mid]) {
System.out.println("1");
break;
}
else {
if(input[i]<=array[mid])
last=mid-1;
else
first=mid+1;
}
}
if(first>last)
System.out.println("0");
}
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 이분 탐색을 사용한다
- 이분탐색을 사용하기 위해서는 정렬된 오름차순이어야 한다. 따라서 array를 오름차순으로 정렬한다.
- m개의 정수를 input 배열에 저장하고, for문을 이용해 하나씩 순회한다.
- for문안에서 while문을 돌려 이분탐색을 진행한다. 이분탐색은 시작 인덱스 first와 마지막 인덱스 last를 반씩 줄여가면서 진행한다. 둘이 만나면 while문을 종료한다. while문이 끝날 때 까지 1을 출력하지 못한다면 input[i]가 없다는 뜻이므로 0을 출력한다.
- first와 last의 중간 인덱스인 mid를 구한 후, array[mid]가 input[i]와 같다면 1을 출력한다.
- input[i]가 array[mid]보다 작다면 last를 조정하여 범위를 줄이고, 크다면 first를 조정한다.