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";
}
}
/*
*/
'๐๏ธ PS (BOJ) > Binary Search' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 2805๋ฒ: ๋๋ฌด ์๋ฅด๊ธฐ (0) | 2023.11.06 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 1107๋ฒ: ๋ฆฌ๋ชจ์ปจ (0) | 2023.01.21 |
[BOJ] ๋ฐฑ์ค 2110๋ฒ: ๊ณต์ ๊ธฐ ์ค์น (0) | 2022.10.13 |
๋ฐฑ์ค 1920๋ฒ: ์ ์ฐพ๊ธฐ (0) | 2022.10.13 |
[BOJ B2][C++] ๋ฐฑ์ค 2858๋ฒ: ๊ธฐ์์ฌ ๋ฐ๋ฅ (0) | 2022.09.21 |