[Binary Search] Boj7795: 먹을 것인가 먹힐 것인가

Kyungtaek Oh·2022년 3월 20일
0

[백준 BOJ] Problems

목록 보기
18/36

[Binary Search] Boj7795: 먹을 것인가 먹힐 것인가

Link: https://www.acmicpc.net/problem/7795

문제

심해에는 두 종류의 생명체 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보다 큰 쌍의 개수를 출력한다.

문제 접근

A리스트의 수들이 B리스트의 수들 중 큰 수가 몇개인지 구하는 문제이기 때문에 하나씩 다 구하면 NxN번 연산을 해야한다. 따라서 시간초과 문제가 발생할 것이기 때문에 이분 탐색을 통해 연산을 해야한다는 것을 알수있다. 이분탐색으로 연산하면 Nxlog(M)만큼의 시간이 걸린다.

Code | Python

import sys
si = sys.stdin.readline
T = int(si())

def BS(list_,L,R,X):
	result = L-1
	while L <= R:
		M = (L+R)//2
		if list_[M] < X:
			result = M
			L = M+1
		else:
			R = M-1
	return result

def runTest():
	Asize,Bsize = map(int,si().split())
	A = list(map(int,si().split()))
	B = list(map(int,si().split()))
	B.sort()

	answer = 0
	for x in A:
		answer += BS(B,0,Bsize-1,x) + 1
	print(answer)

for _ in range(T):
	runTest()

Screenshot

profile
Studying for Data Analysis, Data Engineering & Data Science

0개의 댓글