문제 링크 : https://www.acmicpc.net/problem/10816
풀이
sort() 메서드와 해당 값보다 큰 값이 처음으로 나타는 index를 반환하는 upper_bound() 메서드, 해당 값이 처음으로 나타는 index를 반환하는 lower_bound() 메서드를 사용하면 간단하게 풀 수 있는 문제이다.
#include <iostream>
#include <algorithm>
using namespace std;
int A[500005];
int n, m;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 0; i < n; i++){
cin >> A[i];
}
sort(A, A+n);
cin >> m;
int tmp;
while(m--){
cin >> tmp;
if(!binary_search(A, A+n, tmp)){
cout << 0 << "\n";
continue;
}
cout << upper_bound(A, A+n, tmp) - lower_bound(A, A+n, tmp) << "\n";
}
}
직접 upper_bound와 lower_bound를 직접 구현해서 풀이해 보면 다음과 같다.
#include <iostream>
#include <algorithm>
using namespace std;
int A[500005];
int n, m;
int lower_idx(int tgt){
int st = 0;
int ed = n;
while(st < ed){
int mid = (st+ed)/2;
if(A[mid] >= tgt) ed = mid;
else st = mid+1;
}
return st;
}
int upper_idx(int tgt){
int st = 0;
int ed = n;
while(st < ed){
int mid = (st+ed)/2;
if(A[mid] > tgt) ed = mid;
else st = mid+1;
}
return st;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 0; i < n; i++){
cin >> A[i];
}
sort(A, A+n);
cin >> m;
int tmp;
while(m--){
cin >> tmp;
if(!binary_search(A, A+n, tmp)){
cout << 0 << " ";
continue;
}
cout << upper_bound(A, A+n, tmp) - lower_bound(A, A+n, tmp) << " ";
}
}
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
(C++) 백준 1654번 - 랜선 자르기 (0) | 2023.05.08 |
---|---|
(C++) 백준 18870번 - 좌표 압축 (0) | 2023.05.08 |
(C++) 백준 1920번 - 수 찾기 (0) | 2023.05.08 |
(C++) 백준 12852번 - 1로 만들기 2 (0) | 2023.05.08 |
(C++) 백준 11659번 - 구간 합 구하기 4 (0) | 2023.05.08 |