본문 바로가기

Algorithm/Binary Search

(C++) - 백준(BOJ) 7795번 : 먹을 것인가 먹힐 것인가

반응형

www.acmicpc.net/problem/7795

 

7795번: 먹을 것인가 먹힐 것인가

심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을

www.acmicpc.net

lower_bound를 구현해보는 혹은 사용해보는 문제였습니다.

 

풀이방법

 1. a,b를 오름차순으로 정렬합니다.

 2. 모든 a의 원소들에 대해서 이분탐색을 시행합니다. a의 원소가 b의 원소 이하가 되는 index 지점을 찾게 된다면 해당 index지점까지 생명체 a는 b생명체를 먹을 수 있습니다. 이를 다르게 표현하자면 a의 원소값의 lower_bound 지점을 b에서 찾게 된다면 그 지점을 다 더한 값이 답입니다.

 3. 답 출력

 

Code

#include <bits/stdc++.h>
using namespace std;
int n, t;
int bs(int aElement, vector<int> &b){
    int l = 0;
    int r = b.size() - 1;
    int lowerBoundIdx = 0;
    while(l<=r){
        int mid = (l+r)/2;
        //aElement의 lower_bound index 찾기
        if(aElement > b[mid]) l = mid + 1;
        else r = mid - 1;
    }
    return l;
}

int main(){
    cin >> t;
    while(t--){
        int aCnt,bCnt,ans = 0;
        cin >> aCnt >> bCnt;
        vector <int> a(aCnt);
        vector <int> b(bCnt);

        for(int i = 0; i < aCnt; i++) cin >> a[i];
        for(int i = 0; i < bCnt; i++) cin >> b[i];

        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        
        for(int i = 0; i < aCnt; i++) ans += bs(a[i],b);
        cout << ans << '\n';
    }
}