https://www.acmicpc.net/problem/10816
#include<iostream>
#include<set>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
map<int, int> m1;
int N = 0, M = 0;
int Num;
cin >> N;
vector<int> Result;
vector<int> v1;
//vector<int> v2(N);
for (int i = 0; i < N; i++)
{
cin >> Num;
if (m1.count(Num) == 0)
m1.emplace(Num, 1);
else
m1[Num] ++;
}
//sort(v1.begin(), v1.end());
cin >> M;
for (int i = 0; i < M; i++)
{
cin >> Num;
if (m1.count(Num) == 0)
Result.push_back(0);
else
Result.push_back(m1[Num]);
}
for (int i = 0; i < M; i++)
{
cout << Result[i] << " ";
}
}
map을 사용하고 숫자를 key 값으로 숫자의 개수를 value로 지정하여 문제를 해결하였다.
( map.count() --> key 값이있으면 개수 반환 없으면 0 반환)
다른 풀이를 보니 C++의 upper_bound와 lower_bound를 이용하여 풀었다.
uppoer_bound는 이분탐색으로 해당 숫자가 끝나는 위치를 반환하고
lower_bound는 이분탐색으로 해당 숫자가 시작되는 위치를 반환하게 된다 .
따라서
upper_bound의 위치와 lower_bound의 위치를 빼주면 해당 숫자의 개수를 알 수 있다
(sort로 정렬이 필수일듯)
cin >> n;
int count[n]={0,};
for(auto i = 0;i<n;i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(),arr.end());
cin >> m;
for(auto i =0; i<m;i++) {
int x;
cin >> x;
cout << upper_bound(arr.begin(),arr.end(),x) - lower_bound(arr.begin(),arr.end(),x)<< " ";
밑에 방식이 더 쉬운듯 하다.