각 노래의 장르와 재생수가 주어집니다.
베스트 앨범이란 정보를 뽑아내고자 하는데요
크게 도합 재생수가 많았던 장르 순으로
한 장르에선 최대 2개 곡을 뽑을 수 있는데 이 2개 곡의 순서는 재생수많은순->번호 작은 순 입니다
아주 난리 났다^^^^...끝나고 sort하는 게 싫어서 custom pq를 만들어줬는데 코드가 매우 더럽다.
map<장르,{장르의 재생수, pq<노래의 재생수와번호>}>로 구현했다....
멋쓱..
다른 분들 보니까 sort로 깔끔하게 해결하신 것 같다.
#include <string>
#include <vector>
#include<unordered_map>
#include<queue>
#include<algorithm>
using namespace std;
struct song{
int p, i;//identifier
song(int pp, int ii){
p = pp;i =ii;
}
};
struct comp{
bool operator()(song a, song b){
if(a.p==b.p){
return a.i>b.i;
}
return a.p<b.p;
}
};
bool compare(pair<int,priority_queue<song, vector<song>,comp>> &a, pair<int,priority_queue<song, vector<song>,comp>> &b){
return a.first>b.first;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
unordered_map<string,pair<int,priority_queue<song, vector<song>,comp>>> m;
for(int i = 0;i<genres.size();i++){
unordered_map<string,pair<int,priority_queue<song, vector<song>,comp>>>::iterator it =
m.find(genres[i]);
if(it==m.end()){
priority_queue<song, vector<song>,comp> pq;
pq.push(song(plays[i],i));
m[genres[i]]={plays[i],pq};
}
else{
it->second.second.push(song(plays[i],i));
it->second.first+=plays[i];
}
}
vector<pair<int,priority_queue<song, vector<song>,comp>>> v;
for(unordered_map<string,pair<int,priority_queue<song, vector<song>,comp>>>
::iterator it = m.begin();it!=m.end();it++){
v.push_back(it->second);
}
sort(v.begin(),v.end(),compare);
for(int i = 0;i<v.size();i++){
int ctr = 0;
while(!v[i].second.empty()&&ctr<2){
answer.push_back(v[i].second.top().i);
v[i].second.pop();
ctr++;
}
}
return answer;
}