Unordered_map이 그럼 제일 좋을까??
저장한 자료가 적을 때에는 메모리 낭비와 검색 시 오버헤드가 생기게 됩니다. 따라서 이런 경우는 vector나 list가 unordered_map보다 빠르게 됩니다.(수 천이상의 자료를 저장할때, unordered_map을 사용하는 것이 좋습니다.)
관련문제: 프로그래머스 베스트앨범
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
bool compare(const pair<int,int> &a, const pair<int,int> &b){
return a.second>b.second;//장르별로 재생 순서 내림차순 정렬.
}
bool compare_total(const pair<string,int> &a, const pair<string,int> &b){
return a.second>b.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
unordered_map<string,vector<pair<int,int>>> genre_playlist; //index와 각각 재생횟수 저장.
unordered_map<string,int> genre_play_cnt;
vector<pair<string,int>> genre_play_cnt_v;
for(int i=0;i<genres.size();i++){
genre_play_cnt[genres[i]]+=plays[i];//장르별로 총 재생 횟수 계산.
genre_playlist[genres[i]].push_back(make_pair(i,plays[i]));
}
for(auto &k: genre_playlist){//각 장르 안에서 음악 재생 순서대로 내림차순 정렬.
sort(k.second.begin(),k.second.end(),compare);
}
genre_play_cnt_v.assign(genre_play_cnt.begin(),genre_play_cnt.end());
sort(genre_play_cnt_v.begin(), genre_play_cnt_v.end(),compare_total);//장르를 총 조회수가 많은 순서 내림차순으로 정렬.
for(int i=0;i<genre_play_cnt_v.size();i++){
string genre_name=genre_play_cnt_v[i].first;
for(int j=0; (j<genre_playlist[genre_name].size()) && (j<2) ; j++){
answer.push_back(genre_playlist[genre_name][j].first);
}
}
return answer;
}
읽어 주셔서 감사합니다.🙂