compare은 vector<pair<int,int>>로
생성할때 sum_v(genre_sum.begin(), genre_sum.end())
sort할때 & 주소를 넣어야 수정됨
playlist의 second가 vector이므로 장르별 곡에 대한 정렬은 ele.second.begin()
장르별로 노래 재생 수 합이 큰 장르부터
장르 안의 노래 재생 수가 큰 장르부터
같은 노래 재생 수라면 고유번호가 낮은 노래 먼저
장르1 - {고유번호, 재생수}, {고유번호, 재생수}
장르2 -
umap<string, <int,int>>
umapSum<string, int>
해당 장르에 plays를 계속 더함
umap에 pair로 고유번호랑 추가
umapSum에서 가장 큰 int부터 선택 후 제거
해당 string key를 가지는 umap에서
plays value 값이 큰 값부터 찾은 후 제거
만일 같은 값이면 고유번호 낮은 노래 먼저
장르별 2곡까지만 수록
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
bool comp_sum(pair<string, int> a, pair<string, int> b){
return a.second > b.second;
}
bool comp_play(pair<int, int> a, pair<int, 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>>> playlist;
unordered_map<string, int> genre_sum;
for(int i=0;i<genres.size();i++){
playlist[genres[i]].push_back(make_pair(i,plays[i]));
genre_sum[genres[i]] += plays[i];
}
vector<pair<string, int>> genre_sum_v(genre_sum.begin(), genre_sum.end());
sort(genre_sum_v.begin(), genre_sum_v.end(), comp_sum);
for(auto &ele : playlist){
sort(ele.second.begin(), ele.second.end(), comp_play);
}
for(auto ele : genre_sum_v){
int size = playlist[ele.first].size();
for(int i=0;i<min(2, size);i++){
answer.push_back(playlist[ele.first][i].first);
}
}
return answer;
}
#include <iostream>
#include <vector>
#include <map>
using namespace std;
map<string, map<int,int>> umap;
map<string, int> umapSum;
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
for (int i = 0; i < genres.size(); i++) {
umap[genres[i]][i] = plays[i];
umapSum[genres[i]] += plays[i];
}
while (umap.size() > 0) {
int playesMax = 0;
string genresMax = "";
for (auto genre : umapSum) {
if (genre.second > playesMax) {
genresMax = genre.first;
playesMax = genre.second;
}
}
for (int i = 0; i < 2; i++) {
if (umap[genresMax].size() == 0)break;
int plays = 0;
int index = -1;
for (auto music : umap[genresMax]) {
if (music.second > plays) {
plays = music.second;
index = music.first;
}
}
answer.push_back(index);
umap[genresMax].erase(index);
}
umap.erase(genresMax);
umapSum.erase(genresMax);
}
return answer;
}
int main(void)
{
vector<string> genres = { "classic", "pop", "classic", "classic", "pop" };
vector<int> plays = { 500, 600, 150, 800, 2500 };
vector<int> answers = solution(genres, plays);
for(auto answer:answers)
cout << answer<<" ";
return 0;
}
#include <iostream>
#include <vector>
#include <map>
using namespace std;
map<string, map<int,int>> umap;
map<string, int> umapSum;
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
for (int i = 0; i < genres.size(); i++) {
umap[genres[i]][i] = plays[i];
umapSum[genres[i]] += plays[i];
}
while (umap.size() > 0) {
int playesMax = 0;
string genresMax = "";
for (auto genre : umapSum) {
if (genre.second > playesMax) {
genresMax = genre.first;
playesMax = genre.second;
}
}
for (int i = 0; i < 2; i++) {
if (umap[genresMax].size() == 0)break;
int plays = 0;
int index = -1;
for (auto music : umap[genresMax]) {
if (music.second > plays) {
plays = music.second;
index = music.first;
}
}
answer.push_back(index);
umap[genresMax].erase(index);
}
umap.erase(genresMax);
umapSum.erase(genresMax);
}
return answer;
}
int main(void)
{
vector<string> genres = { "classic", "pop", "classic", "classic", "pop" };
vector<int> plays = { 500, 600, 150, 800, 2500 };
vector<int> answers = solution(genres, plays);
for(auto answer:answers)
cout << answer<<" ";
return 0;
}
map과 unordered_map의 차이
https://gyong0.tistory.com/70