문제풀이/백준oj
[백준OJ] 7795번 먹을 것인가 먹힐 것인가
Hyeon-Uk
2022. 11. 29. 03:41
반응형
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
풀이
B의 원소들을 정렬한 뒤, LowerBound를 통해 A의 각 원소보다 작은 B의 원소의 개수를 구해주는 방법을 선택함
시간 복잡도
정렬은 O(NLogN)
LowerBound는 O(LogN)이 되므로, 시간복잡도는 O(NLogN)이 된다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
//O(LogN)
public static int lowerBound(int[] list, int target){
int left = 0;
int right = list.length-1;
while(left<=right){
int middle = (left+right)/2;
if(list[middle]<target){
left++;
}
else{
right--;
}
}
return left;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.valueOf(br.readLine());
for(int tt=0;tt<t;tt++){
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.valueOf(st.nextToken());
int m = Integer.valueOf(st.nextToken());
int[] A = new int[n];
int[] B = new int[m];
//O(N)
st = new StringTokenizer(br.readLine());
for(int i=0;i<n;i++){
A[i]=Integer.valueOf(st.nextToken());
}
//O(M)
st = new StringTokenizer(br.readLine());
for(int i=0;i<m;i++){
B[i]=Integer.valueOf(st.nextToken());
}
//O(MLogM)
Arrays.sort(B);
int answer = 0;
//O(N)
for(int i=0;i<n;i++){
answer+=lowerBound(B,A[i]);
}
System.out.println(answer);
}
}
}
반응형