[プログラマー]ベストアルバム
問題の説明
各曲の種類と再生数
ベストアルバムの情報を見つけたいです.
再生回数が一番多いタイプによって.
1つのタイプでは、最大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;
}
Reference
この問題について([プログラマー]ベストアルバム), 我々は、より多くの情報をここで見つけました https://velog.io/@coding3392/프로그래머스-베스트앨범テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol