심해에는 두 종류의 생명체 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
보다 큰 쌍의 개수를 출력한다.T = int(input())
for _ in range(T):
N, M = list(map(int, input().split()))
A = list(map(int, input().split()))
B = list(map(int, input().split()))
A = sorted(A)
B = sorted(B)
main = 0
sub = 0
count = 0
while main < N:
if sub == M:
count += sub
main += 1
else:
if A[main] > B[sub]:
sub += 1
else:
count += sub
main += 1
print(count)
투 포인터
알고리즘을 이용해서 풀었고 , 테스트 케이스 T
만큼 반복 해준다.A
배열과 B
배열을 각각 오름차순 정렬해준다.A
배열을 순회할 main
과 B
배열을 순회할 sub
그리고 개수를 출력할 count
변수를 초기화 한다.sub
가 M
과 같으면 sub
를 count
에 더해주고 main
을 한칸 옮겨준다.main
이 sub
보다 크면 sub
를 한칸 옮겨주고 작으면 sub
의 값을 count
에 더해주고 main
을 한칸 이동시켜주면 된다.count
출력import sys
input = sys.stdin.readline
def sol():
for _ in range(int(input())):
_,M = map(int,input().split())
A,B = sorted(list(map(int,input().split()))),sorted(list(map(int,input().split())))
num = n = 0
for a in A:
while n < M and a > B[n]:
n += 1
num += n
print(num)
sol()
투 포인터
이다. 각 배열들을 정렬시켜준다.num
에 A[i]
> B[j]
를 만족하는 쌍의 개수를 저장한다.B
에서 a
보다 작은 원소 B[n]
이 있으면 n
을 증가한다.num
에 n
을 누적시킨다.
- 다른 풀이는 백퍼센트 이해가 안가기는 하지만 역시 고수들이 많은 듯😇