728x90
https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_BJ_1920_수찾기 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++)
arr[i] = Integer.parseInt(st.nextToken());
// 이분 탐색 위한 정렬
Arrays.sort(arr);
int m = Integer.parseInt(br.readLine());
int[] find = new int[m];
st = new StringTokenizer(br.readLine());
for(int i=0; i<m; i++)
find[i] = Integer.parseInt(st.nextToken());
for(int i=0; i<m; i++) {
//binary Search
int low = 0;
int high = n-1;
int mid = 0;
int key = find[i];
boolean flag = false; // 탐색 성공
while (low <= high) {
mid = (low + high) / 2;
if(key == arr[mid]) {
System.out.println(1);
flag = true;
break;
}
else if(key < arr[mid]){
high = mid-1;
}
else{
low = mid+1;
}
}//while
if(!flag){
System.out.println(0);
}
}//for
}
}
이진 탐색(이분 탐색)을 연습해보려고 쉬운 문제를 골라봤다.
일단, 범위가 어마무시하기 때문에 이진 탐색이라고 생각하고 있어야 한다!!
따라서, 입력받은 것들을 배열로 오름차순으로 만들어주고, 이진탐색을 수행하면서 key가 존재하는지 살펴보면 된다.
<이진탐색 간단 정리>
1. 탐색할 배열 정렬
2. low, high, mid 값 설정
- 초기엔 low가 0, high가 맨 마지막 인덱스
- mid는 계속 갱신해나가는데 (low+high) / 2이다
3. 3가지 경우로 나눌 수 있음
- key == 배열[mid]
- 바로 탈출하면 된다
- key < 배열[mid]
- 찾는 값은 가운데보다 왼쪽에 존재한다는 의미
- high = mid-1로 갱신
- key > 배열[mid]
- 찾는 값은 가운데보다 오른쪽에 존재한다는 의미
- low = mid+1로 갱신
4. 3의 과정을 low <= high가 될 때까지 반복하면 된다. 이 조건까지 온다면 값이 존재하지 않는다는 의미!
728x90
'코테 > 백준' 카테고리의 다른 글
백준 1107 리모컨(JAVA) (1) | 2023.01.14 |
---|---|
백준 1874 스택 수열(JAVA) (0) | 2023.01.13 |
백준 2869 달팽이는 올라가고 싶다(JAVA) (0) | 2023.01.12 |
백준 5430 AC(JAVA) (0) | 2023.01.12 |
백준 11047 동전0 (JAVA) (0) | 2023.01.11 |