[프로그래머스] 베스트앨범

klean·2020년 11월 23일
0

문제 설명

각 노래의 장르와 재생수가 주어집니다.
베스트 앨범이란 정보를 뽑아내고자 하는데요
크게 도합 재생수가 많았던 장르 순으로
한 장르에선 최대 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;
}

0개의 댓글