https://school.programmers.co.kr/learn/courses/30/lessons/42579

/*
map에 장르별로 묶는다.
vector<GenreInfo>로 옮긴다.
장르는 총 재생수 기준 정렬한다.
장르 내부 노래는 재생수 내림차순, 같으면 인덱스 오름차순 정렬한다.
앞에서 2개만 뽑는다.
*/
#include<string>
#include<vector>
#include<map>
#include<algorithm>

using namespace std;

struct Song{
    int play;
    int idx;
};
struct GenreInfo{
    string name;
    int totalPlay = 0;
    vector<Song> songs;
};

bool CompareGenre(const GenreInfo& lGenre, const GenreInfo& rGenre){
    return lGenre.totalPlay > rGenre.totalPlay;
}
bool CompareSong(const Song& lSong, const Song& rSong){
    if(lSong.play == rSong.play){
        return lSong.idx < rSong.idx;
    }
    return lSong.play > rSong.play;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, GenreInfo> genreMap;
    
    //장르별 총 재생수와 노래 목록 저장
    for(int idx = 0; idx < genres.size(); ++idx){
        string genreName = genres[idx];
        
        genreMap[genreName].name = genreName; // 생략해도 되나 디버깅용
        genreMap[genreName].totalPlay += plays[idx];
        genreMap[genreName].songs.push_back({plays[idx], idx});
    }
    
    //map -> vector로 옮기기
    vector<GenreInfo> genreList;
    for(auto& item : genreMap){
        genreList.push_back(item.second); // map의 value값 넣기
    }
    
    //장르 총 재생수 내림차순 정렬
    sort(genreList.begin(), genreList.end(), CompareGenre);
    
    //각 장르 안에서 노래 정렬 후 2개 씩 선택
    for(auto& currentGenre : genreList){
        sort(currentGenre.songs.begin(), currentGenre.songs.end(), CompareSong);
        
        //songIdx < size() 조건은 장르의 plays 갯수가 1일 경우가 존재하기에  (1<=plays<=10000)
        for(int songIdx = 0; songIdx<currentGenre.songs.size() && songIdx < 2 ; songIdx++){
            answer.push_back(currentGenre.songs[songIdx].idx);
        }
    }
    return answer;
}

+ Recent posts