: first 값만으로 정렬이 가능하므로, multimap으로 풀경우 머리 아파진다...
second값은 삽입 순서로만 나온다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
bool check(pair<int, int> a, pair<int, int>b)
{
if (a.first == b.first)
return a.second > b.second;
return a.first > b.first;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
multimap<string, pair<int, int>>mm;
map<string, int> m;
for (int i = 0; i < plays.size(); i++)
{
m[genres[i]] += plays[i];
mm.insert(make_pair(genres[i], make_pair(plays[i], i)));
}
map<int, string, greater<int>>revM;
//역으로 변경함. 숫자 - string으로 저장시킴.
for (const auto & i : m)
revM[i.second] = i.first;
for (const auto &i : revM)
{
vector<pair<int, int>>v;
auto iter = mm.find(i.second);
while(iter != mm.end() && iter->first == i.second)
{
v.push_back({ iter->second.first, iter->second.second });
iter++;
}
sort(v.begin(), v.end(), check);
for (int i = 0; i < v.size(); i++)
{
if (i == 2)
break;
answer.push_back(v[i].second);
}
}
return answer;
}
젠장!!!
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
bool check(pair<int, int> a, pair<int, int>b)
{
//부등호 중요하다.... 노래 수록 기준 3번
if (a.first == b.first)
return a.second < b.second;
return a.first > b.first;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
multimap<string, pair<int, int>>mm;
map<string, int> m;
for (int i = 0; i < plays.size(); i++)
{
m[genres[i]] += plays[i];
mm.insert(make_pair(genres[i], make_pair(plays[i], i)));
}
map<int, string, greater<int>>revM;
//역으로 변경함. 숫자 - string으로 저장시킴.
for (const auto & i : m)
revM[i.second] = i.first;
for (const auto &i : revM)
{
vector<pair<int, int>>v;
auto iter = mm.find(i.second);
while(iter != mm.end() && iter->first == i.second)
{
v.push_back({ iter->second.first, iter->second.second });
iter++;
}
sort(v.begin(), v.end(), check);
for (int i = 0; i < v.size(); i++)
{
if (i == 2)
break;
answer.push_back(v[i].second);
}
}
return answer;
}