문제
심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을 수 있는 쌍의 개수는 7가지가 있다. 8-3, 8-6, 8-1, 7-3, 7-6, 7-1, 3-1.
두 생명체 A와 B의 크기가 주어졌을 때, A의 크기가 B보다 큰 쌍이 몇 개나 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 A의 수 N과 B의 수 M이 주어진다. 둘째 줄에는 A의 크기가 모두 주어지며, 셋째 줄에는 B의 크기가 모두 주어진다. 크기는 양의 정수이다. (1 ≤ N, M ≤ 20,000)
출력
각 테스트 케이스마다, A가 B보다 큰 쌍의 개수를 출력한다.
예제 입력 1 복사
2
5 3
8 1 7 3 1
3 6 1
3 4
2 13 7
103 11 290 215
예제 출력 1 복사
7
1
• 풀이
입력받는 A쌍, B쌍을 오름차순 정렬하고 A쌍에서 고른 원소가 B쌍의 특정 원소보다 크다면 B쌍의 처음부터 해당원소까지는 다 먹을 수 있다
이분탐색을 이용해서 A전체 * logN 으로 NlogN으로 풀 수 있었다
import java.util.*;
import java.io.*;
class Main
{
static int binary_search(int target, int[] arr){
int lt = 0;
int rt = arr.length-1;
int res = 0;
while (lt <= rt){
int m = (lt + rt) / 2;
if (arr[m] < target){
res = Math.max(res, m+1);
lt = m+1;
}
else rt = m-1;
}
return res;
}
public static void main (String[] args) throws IOException {
Scanner in = new Scanner(System.in);
int count = in.nextInt();
while (count-- > 0){
int res = 0;
int n = in.nextInt();
int m = in.nextInt();
int[] a = new int[n];
int[] b = new int[m];
for (int i = 0; i < n; i++) a[i] = in.nextInt();
for (int i = 0; i < m; i++) b[i] = in.nextInt();
Arrays.sort(a);
Arrays.sort(b);
for (int i = 0; i < n; i++){
int tmp = a[i];
res += binary_search(tmp, b);
}
System.out.println(res);
}
}
}
'자바 알고리즘 > 백준' 카테고리의 다른 글
백준 5430 : AC (0) | 2024.05.30 |
---|---|
백준 15825 : Router (0) | 2024.05.22 |
백준 2503 : 숫자야구 (0) | 2024.05.20 |
백준 1475: 방번호 (0) | 2024.05.20 |
백준 1406 : 에디터 (LinkedList, List Iterator) (0) | 2024.05.19 |