
하하! 수 찾기 문제랑 비슷해서 바로 풀어버릴 줄 알았는데
💡 이분탐색의 목적: 특정 값에 대한 배열의 특정인덱스
중복원소는 정렬 후에 upperbound, lowerbound 이용
Lower Bound / Upper Bound

key = 4 라고 할 때, 이미지에서 처음으로 마주하는 key값 이상을 가지고 있는 값은 arr[3] 이므로 해당 값의 인덱스가 lower bound가 됩니다.


중복원소의 갯수?
upper bound code
private static int upperBound(int arr[], int key) {
int lo = 0;
int hi = arr.length;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (key < arr[mid]) {
hi = mid;
}else{
lo = mid + 1;
}
}
return lo;
}
lower bound code
private static int lowerBound(int arr[], int key) {
int lo = 0;
int hi = arr.length;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (key <= arr[mid]) {
hi = mid;
} else {
lo = mid +1;
}
}
return lo;
}
}
10816 전체 코드
import java.util.StringTokenizer;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] arr = new int[N];
for(int i = 0; i < N; i++) {
arr[i] = in.nextInt();
}
Arrays.sort(arr);
int M = in.nextInt();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
int key = in.nextInt();
sb.append(upperBound(arr, key) - lowerBound(arr, key)).append(' ');
}
System.out.println(sb);
}
private static int lowerBound(int[] arr, int key) {
int lo = 0;
int hi = arr.length;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (key <= arr[mid]) {
hi = mid;
}
else {
lo = mid + 1;
}
}
return lo;
}
private static int upperBound(int[] arr, int key) {
int lo = 0;
int hi = arr.length;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (key < arr[mid]) {
hi = mid;
}
else {
lo = mid + 1;
}
}
return lo;
}
}