반응형
문제
https://www.acmicpc.net/problem/10816
10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
풀이
숫자를 찾을 때 이분 탐색을 이용해 빠르게 찾을 수 있다. 같은 숫자를 여러 개 찾아야하는데 이분 탐색을 이용해 상한선과 하한선을 찾는다.
코드
java
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int N, M;
static int[] a, b;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
input();
solve();
}
private static void solve() {
Arrays.sort(a);
for (int i = 0; i < M; i++) {
int cnt = upperBound(a, 0, N - 1, b[i]) - lowerBound(a, 0, N - 1, b[i]);
if (cnt == -1) cnt = 0;
sb.append(cnt).append(" ");
}
System.out.println(sb.toString());
}
private static int lowerBound(int[] arr, int l, int r, int x) {
int idx = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] > x) {
r = mid - 1;
} else if (arr[mid] < x) {
l = mid + 1;
} else {
idx = mid;
r = mid - 1;
}
}
return idx;
}
private static int upperBound(int[] arr, int l, int r, int x) {
int idx = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] > x) {
r = mid - 1;
} else if (arr[mid] < x) {
l = mid + 1;
} else {
idx = mid;
l = mid + 1;
}
}
if (idx != -1) idx++;
return idx;
}
private static void input() {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
a = new int[N];
for (int i = 0; i < N; i++)
a[i] = sc.nextInt();
M = sc.nextInt();
b = new int[M];
for (int i = 0; i < M; i++)
b[i] = sc.nextInt();
sc.close();
}
}
반응형
'BOJ' 카테고리의 다른 글
백준 2252 - 줄 세우기 (0) | 2022.02.22 |
---|---|
백준 11725 - 트리의 부모 찾기 (0) | 2022.02.17 |
백준 7795 - 먹을 것인가 먹힐 것인가 (0) | 2022.02.03 |
백준 15970 - 화살표 그리기 (0) | 2022.02.02 |
백준 20291 - 파일 정리 (0) | 2022.02.01 |