# 백준 7795번 먹을 것인가 먹힐 것인가

## Solution

import java.io.*;
import java.util.*;

public class Main {
static StringBuilder sb = new StringBuilder();

static int N, M;
static int[] A, B;

static void input() {
N = scan.nextInt();
M = scan.nextInt();
A = new int[N + 1];
B = new int[M + 1];
for (int i = 1; i <= N; i++) {
A[i] = scan.nextInt();
}
for (int i = 1; i <= M; i++) {
B[i] = scan.nextInt();
}
}

static int lower_bound(int[] B, int L, int R, int X) {
int result = 0;

while (L <= R) {
int mid =( L+R )/ 2;
if (B[mid] < X) {
result = mid;
L = mid + 1;
} else {
R = mid -1;
}
}

return result;
}

static void pro() {
// B 배열에 대해 이분탐색을 할 예정이니까, 정렬을 해주자!
Arrays.sort(B, 1, M+1);

int ans = 0;
for (int i = 1; i <= N; i++) {
// A[i] 를 선택했을 때, B 에서는 A[i]보다 작은 게 몇 개나 있는 지 count하기
ans += lower_bound(B, 1, M, A[i]);
}
System.out.println(ans);
}

public static void main(String[] args) {
int TT;
TT = scan.nextInt();
for (int tt = 1; tt <= TT; tt++) {
input();
pro();
}
}

StringTokenizer st;

}

public FastReader(String s) throws FileNotFoundException {
}

String next() {
while (st == null || !st.hasMoreElements()) {
try {
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}

int nextInt() {
return Integer.parseInt(next());
}

long nextLong() {
return Long.parseLong(next());
}

double nextDouble() {
return Double.parseDouble(next());
}

String nextLine() {
String str = "";
try {
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}
• python 풀이
import sys

def lower_bound(a, l, r, x):
res = l - 1
while l <= r:
mid = (l + r) // 2
if a[mid] < x:
res = mid
l = mid + 1
else: r = mid - 1
return res

def solve():
b.sort()
ans = 0
for x in a:
ans += lower_bound(b, 0, m - 1, x) + 1
print(ans)

TT = int(si())
for _ in range(TT):
n, m = list(map(int, si().split()))
a = list(map(int, si().split()))
b = list(map(int, si().split()))
solve()