문제
심해에는 두 종류의 생명체 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보다 큰 쌍의 개수를 출력한다.
예제 입력 1 복사
2
5 3
8 1 7 3 1
3 6 1
3 4
2 13 7
103 11 290 215
풀이
무작정 비교하기
import sys
input = sys.stdin.readline
answer = []
t = int(input())
def compare(a,b):
cnt=0
for i in a:
for j in b:
if i>j:
cnt += 1
answer.append(cnt)
for k in range(t):
n, m = map(int, input().split())
A_list = list(map(int, input().split()))
B_list = list(map(int, input().split()))
compare(A_list,B_list)
for i in answer:
print(i)
- 무작정 비교했더니 시간초과가 났다
이분탐색
# 이진 탐색 함수 정의
def binarySearch(a):
start = 0
end = M - 1
result = 0
# 이진 탐색을 반복하여 실행
while start <= end:
mid = (start + end) // 2 # 중간 인덱스 계산
# 중간 값(mid)이 a보다 작으면, 더 큰 범위에서 찾음
if B[mid] < a:
start = mid + 1
result = mid # 현재 mid 값을 기록 (작은 값의 개수를 세기 위해)
else:
end = mid - 1
# result에 저장된 값은 a보다 작은 값의 개수를 나타냄
return result + 1 # 0부터 시작하는 인덱스를 1부터 시작하는 개수로 변환하여 반환
# 테스트 케이스 수 입력
for _ in range(int(input())):
N, M = map(int, input().split()) # 배열의 크기 N과 M 입력
A = sorted(list(map(int, input().split()))) # 배열 A 입력 및 정렬
B = sorted(list(map(int, input().split()))) # 배열 B 입력 및 정렬
answer = 0 # 결과를 저장할 변수 초기화
# 배열 A의 각 원소에 대해 이진 탐색을 수행하고 결과를 누적
for i in A:
if i > B[0]: # i가 B 배열의 최소값보다 큰 경우에만 탐색 수행
t = binarySearch(i) # i보다 작은 값의 개수를 이진 탐색으로 찾음
answer += t # 결과를 누적
print(answer) # 결과 출력
'알고리즘 문제 > 백준' 카테고리의 다른 글
[알고리즘][백준][python] 연구소 (0) | 2023.10.05 |
---|---|
[알고리즘][백준][python] 미로 탐색 (0) | 2023.10.03 |
[알고리즘][백준][2805][python] 나무 자르기 (0) | 2023.09.17 |
[알고리즘][백준][15652] N과 M (4) (0) | 2023.09.13 |
[알고리즘][백준][bfs][7574번] 토마토 (0) | 2023.09.13 |