BOJ 10816: 숫자 카드 2 https://www.acmicpc.net/problem/10816
이분 탐색
을 사용한다.최소 인덱스
찾기최대 인덱스
찾기import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine()); // 가지고 있는 숫자 카드 개수
int[] cards = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
cards[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(cards);
int M = Integer.parseInt(br.readLine()); // 구해야 되는 수
int[] targets = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < M; i++) {
targets[i] = Integer.parseInt(st.nextToken());
int result = findByBinarySearch(cards, 0, N - 1, targets[i]);
sb.append(result).append(" ");
}
System.out.println(sb);
}
static int findByBinarySearch(int[] arr, int start, int end, int target) {
int s = start;
int e = end + 1; // 배열의 길이를 인덱스로 넘겨줌(N = end + 1)
// 최소 인덱스 찾기
while (s < e) {
int mid = (s + e) / 2;
// 목표 값이 mid에 있는 값보다 작거나 같다면 -> e 값을 mid 위치로 이동
if (target <= arr[mid]) {
e = mid;
}
// 목표 값이 mid에 있는 값보다 크다면 -> s 값을 mid + 1 위치로 이동
else {
s = mid + 1;
}
}
int minIdx = s; // 목표 값이 있는 최소 인덱스
// 최대 인덱스 찾기
s = start;
e = end + 1;
while (s < e) {
int mid = (s + e) / 2;
// 목표 값이 mid에 있는 값보다 작다면 -> e 값을 mid 위치로 이동
if (arr[mid] > target) {
e = mid;
}
// 목표 값이 mid에 있는 값보다 크거나 같다면 -> s 값을 mid + 1 위치로 이동
else {
s = mid + 1;
}
}
int maxIdx = s; // 목표 값이 있는 최고 인덱스 + 1
return maxIdx - minIdx;
}
}