Algorithm/BOJ
[BOJ - Silver III] 먹을 것인가 먹힐 것인가 / ⭕
cks._.hong
2024. 8. 22. 10:57
1. 제출 코드 (42분 20초 / 이분 탐색)
import java.io.BufferedReader;
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 {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int[] aGroup = new int[a];
int[] bGroup = new int[b];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < a; i++) {
aGroup[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < b; i++) {
bGroup[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(bGroup);
int answer = 0;
for(int i = 0; i < a; i++) {
answer += binary_search(aGroup[i], bGroup);
}
System.out.println(answer);
}
}
public static int binary_search(int value, int[] group) {
int start = 0;
int end = group.length - 1;
int mid = 0;
while(start <= end) {
mid = (start + end) / 2;
if(value > group[mid]) start = mid + 1;
else end = mid - 1;
}
return start;
}
}
2. 구현 로직
B 그룹의 원소들 중 A 그룹의 원소보다 작은 개수를 구하면 되는 문제이다. 일단 B그룹을 정렬하고 A 원소보다 작은 원소 중 가장 근접한 원소의 위치를 찾으면 그 기준으로 왼쪽은 다 작은 원소이다.
- A그룹은 비교 대상이 아니기 때문에 B 그룹만 정렬
- 이분 탐색 함수를 만들어서 start의 위치를 찾는다.
- start를 기준으로 왼쪽은 전부 value보다 작은 값이므로 start를 return 배열이므로 - 1이 기본적으로 되어 있기 때문에 그대로 반환
- 각 원소마다 적용하여 정답 추출
3. 유의할 점
- N과 M이 20,000이므로 시간복잡도가 O(N^2)이면 시간 초과가 날 것 같으니 주의해야 한다.