๐Ÿ•๏ธ PS (BOJ)/Binary Search

[BOJ] ๋ฐฑ์ค€ 10816๋ฒˆ: ์ˆซ์ž ์นด๋“œ 2 (Map ์—†์ด ์ด๋ถ„ํƒ์ƒ‰๋งŒ์œผ๋กœ ํ’€๊ธฐ)

์„ ๋‹ฌ 2022. 10. 13. 17:15
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/10816

 

10816๋ฒˆ: ์ˆซ์ž ์นด๋“œ 2

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,

www.acmicpc.net

 

๋ฌธ์ œ

์ˆซ์ž ์นด๋“œ๋Š” ์ •์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์ ํ˜€์ ธ ์žˆ๋Š” ์นด๋“œ์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ์ˆซ์ž ์นด๋“œ N๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ •์ˆ˜ M๊ฐœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ์ˆ˜๊ฐ€ ์ ํ˜€์žˆ๋Š” ์ˆซ์ž ์นด๋“œ๋ฅผ ์ƒ๊ทผ์ด๊ฐ€ ๋ช‡ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์…‹์งธ ์ค„์—๋Š” M(1 ≤ M ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋„ท์งธ ์ค„์—๋Š” ์ƒ๊ทผ์ด๊ฐ€ ๋ช‡ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์ธ์ง€ ๊ตฌํ•ด์•ผ ํ•  M๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์ ธ ์žˆ๋‹ค. ์ด ์ˆ˜๋„ -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ M๊ฐœ์˜ ์ˆ˜์— ๋Œ€ํ•ด์„œ, ๊ฐ ์ˆ˜๊ฐ€ ์ ํžŒ ์ˆซ์ž ์นด๋“œ๋ฅผ ์ƒ๊ทผ์ด๊ฐ€ ๋ช‡ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด 1 - upperBound, lowerBound ์‚ฌ์šฉ

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int n, m;
    cin >> n;
    vector<int> arr(n,0);
    for(int i=0; i<n; i++)
        cin >> arr[i];
    
    sort(arr.begin(), arr.end());
    
    cin >> m;
    int input;
    while(m--) {
        cin >> input;
        int ans = upper_bound(arr.begin(), arr.end(), input) - lower_bound(arr.begin(), arr.end(), input);
        cout << ans << "\n";
    }
}

/*
 */

 

 

ํ’€์ด2 - upperBound, lowerBound ์ง์ ‘ ๊ตฌํ˜„

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int lowerBound(int left, int right, int target, vector<int> &arr) {
    while(left <= right) {
        int mid = (left+right) /2;
        
        if(arr[mid] >= target)
            right = mid-1;
        else
            left = mid+1;
    }
    
//    1. break ์ง์ „ left์™€ right๋Š” ๊ฐ™์€๊ณณ์„ ๊ฐ€๋ฆฌํ‚ด
//    2. arr[mid] ๋Š” target ๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— left ํฌ์ธํ„ฐ ์ด๋™
//    3. ์ด๋™ํ•œ left ํฌ์ธํ„ฐ๊ฐ’ = target์˜ ์ธ๋ฑ์Šค => return
    
    return left;
}

int upperBound(int left, int right, int target, vector<int>&arr) {
    while(left <= right) {
        int mid = (left+right) / 2;
        
        if(arr[mid] <= target)
            left = mid+1;
        else
            right = mid-1;
    }
    
//    1. arr[mid] <= target์ด๋ฉด left ์ด๋™
//    2. arr[mid] == target์ด๋ฉด left = mid+1 ... left>target ์ธ ์ˆœ๊ฐ„ ๋ฉˆ์ถค
//    3. ์ด๋•Œ left ๊ฐ’ = upperBound!
    
    return left;
}
int main() {
    ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int n, m;
    cin >> n;
    vector<int> arr(n,0);
    for(int i=0; i<n; i++)
        cin >> arr[i];
    
    sort(arr.begin(), arr.end());
    
    cin >> m;
    int input;
    while(m--) {
        cin >> input;
        int ans = upperBound(0, n-1, input, arr) - lowerBound(0, n-1, input, arr);
        cout << ans << "\n";
    }
}

/*
 */

 

๋ฐ˜์‘ํ˜•