첫번째로 소유하고 있는 카드를 입력받는다.
그 이후 입력받는 카드를 몇개 가지고 있는지 출력한다.
Solution
Binary Search 를 활용하여 lower bound와 upper bound를 사용하여 정답을 구할 수 있다.
lower bound : 크거나 같은 수 중 첫번째 수
upper bound : 큰 수 중 첫번째 수
| 1 | 3 | 3 | 4 | 5 | 5 | 
|---|
3의 lower bound : 3 (index = [1])
3의 upper bound : 4
인덱스로 upper bound - lower bound 를 할 시 같은수의 개수가 나온다.
3(index of upper b) - 1(index of lower b) = 2
upper bound는 값을 찾았을때 그보다 큰 값을 취해주어야하기 때문에 upper bound에 mid+1 , left또한 mid+1 한후에 탐색을 계속해준다.
Code
#include <bits/stdc++.h>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, m;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    cin >> m;
    while (m--) {
        int goal;
        cin >> goal;
        int left = 0;
        int right = n - 1;
        int lb, ub;
        lb = 0;
        //lower bound
        while (left <= right) {
            int mid = (left + right) / 2;
            if (a[mid] == goal) {
                lb = mid;
                right = mid - 1;
            }
            else if (a[mid] > goal) {
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        left = 0;
        right = n - 1;
        ub = 0;
        //upper bound
        while (left <= right) {
            int mid = (left + right) / 2;
            if (a[mid] == goal) {
                ub = mid+1;
                left = mid + 1;
            }
            else if (a[mid] > goal) {
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        //같은수의 개수 = upper bound - lower bound
        cout << ub - lb << ' ';
    }
    return 0;
}
참고 : https://code.plus/course/43 , 분할 정복