문제
레벨: S4
알고리즘: 이분 탐색
풀이시간: 10:29
힌트 참조 유무:
https://www.acmicpc.net/problem/1920
1 번째 시도
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
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());
st = new StringTokenizer(br.readLine(), " ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
// 찾고자 하는 값이 있을 경우 1, 없을 경우 0을 출력해야한다.
if(binarySearch(Integer.parseInt(st.nextToken())) >= 0) {
sb.append(1).append('\n');
}
else {
sb.append(0).append('\n');
}
}
System.out.println(sb);
}
public static int binarySearch(int key) {
int lo = 0; // 탐색 범위의 왼쪽 끝 인덱스
int hi = arr.length - 1; // 탐색 범위의 오른쪽 끝 인덱스
// lo가 hi보다 커지기 전까지 반복한다.
while(lo <= hi) {
int mid = (lo + hi) / 2; // 중간위치를 구한다.
// key값이 중간 위치의 값보다 작을 경우
if(key < arr[mid]) {
hi = mid - 1;
}
// key값이 중간 위치의 값보다 클 경우
else if(key > arr[mid]) {
lo = mid + 1;
}
// key값과 중간 위치의 값이 같을 경우
else {
return mid;
}
}
// 찾고자 하는 값이 존재하지 않을 경우
return -1;
}
}
'알고리즘 > 이분탐색' 카테고리의 다른 글
[백준 14003] 가장 긴 증가하는 부분 수열 5 / 자바 / LIS (0) | 2024.08.11 |
---|---|
[백준 1300] K번째 수 / 자바 / 이분탐색 (0) | 2024.08.07 |
[백준] 숫자 찾기 / 자바 (0) | 2024.06.01 |
[백준] 공유기 설치 / 자바 (0) | 2024.05.31 |
[백준] 가장 긴 증가하는 부분 수열 2 / 자바 ** (0) | 2024.05.29 |