728x90
300x250

https://www.acmicpc.net/problem/7795
7795번: 먹을 것인가 먹힐 것인가
심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을
www.acmicpc.net
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//System.setIn(new FileInputStream("Test.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
for (int tc = 0; tc < T; tc++) {
//입력
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int arrA[] = new int[A];
int arrB[] = new int[B];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < A; i++) {
arrA[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arrA);
st = new StringTokenizer(br.readLine());
for (int i = 0; i < B; i++) {
arrB[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arrB);
//A기준으로 B를 이분탐색 (매개변수 탐색)
int res = 0;
for (int i = 0; i < A; i++) {
int s = 0;
int e = B-1;
int ans = -1;
while(s<=e) {
int mid = (s+e)/2;
if( arrA[i] <= arrB[mid] ) {
e = mid - 1;
} else {
s = mid+1;
ans = mid;
}
}
// System.out.println("ans : "+ans);
res += ans+1;
}
System.out.println(res);
}
}
}
투 포인터도 활용할 수있다.
정렬을 했기때문에 A[i]에서 B[j+2]까지 먹었다면 A[i+1]은 B[j+2]은 무조건 먹을거니 B[j+3]만 봐도되는법..
728x90
'알고리즘 > 이분 탐색' 카테고리의 다른 글
| 백준 2512번: 예산 [이분탐색][매개변수탐색] - Java (0) | 2023.09.01 |
|---|---|
| 백준 1654번: 랜선 자르기 [이분탐색][매개변수탐색]-Java (0) | 2023.09.01 |
| 백준 2805번: 나무 자르기 [이분탐색][매개변수탐색][BinarySearch] -Java (0) | 2023.08.30 |
| 백준 2470번: 두 용액 [이분 탐색][투 포인터][정렬] -Java (0) | 2023.08.28 |
| 백준 10816번: 숫자 카드2 [이분 탐색][자료구조] - Java (0) | 2023.08.19 |