728x90
728x90
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보다 큰 쌍의 개수를 출력한다.
풀이
생명체 B 를 오름차순으로 정리한 후에 lower_bound 함수를 이용해 답을 구하였다.
lower_bound - 정렬되어 있는 배열내에서 특정 값을 초과하는 값이 첫 번째로 나오는 인덱스를 찾아낼 때 사용
lower_bound(arr,arr+N,value)
= 배열에서 (arr,arr+N) 범위 내에서 value값보다 크거나 같은 첫번째 원소의 주소를 리턴
만약 없다면 end값 리턴
리턴 값이 주소값이기 때문에 인덱스를 구하려면 첫번째 원소가 가리키는 주소를 빼주면 된다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int cnt;
cin >> cnt;
int num1, num2;
int n;
vector <int> ans;
while (cnt--) {
vector <int> v1;
vector <int> v2;
int pair=0; //정답
cin >> num1>>num2;
for (int i = 0; i < num1; i++) {
cin >> n;
v1.push_back(n);
}
for (int i = 0; i < num2; i++) {
cin >> n;
v2.push_back(n);
}
sort(v2.begin(), v2.end());
for (int i = 0; i < num1; i++) {
pair+= lower_bound(v2.begin(), v2.end(), v1[i]) - v2.begin();
}
cout<<pair<< endl;
}
}
728x90
728x90
'Algorihtm > BOJ' 카테고리의 다른 글
C++ 백준 11062번 : 카드 게임 (0) | 2023.01.12 |
---|---|
C++ 백준 11399번: ATM (0) | 2023.01.11 |
C++ 백준 14425번: 문자열 집합 (1) | 2023.01.10 |
C++ 백준 11656번: 접미사 배열 (0) | 2023.01.09 |
C++ 백준 11047번: 동전 0 (0) | 2023.01.09 |