https://programmers.co.kr/learn/courses/30/lessons/42579
2가지 map
이 필요하다.
map
<string 장르, int 재생횟수> songMap
: 각 장르마다 재생횟수를 누적하여 내림차순으로 정렬한다. map
<string 장르, vector<Song
>> genreCntMap
: 각 장르마다 속한 노래를 Song
구조체 벡터에 push한다.Song
구조체
재생횟수
와 고유번호
를 필드로 가진다.재생횟수
로 내림차순 정렬, 고유번호
로 오름차순 정렬 되도록 설정genreCntMap
와 songMap
모두 기준에 맞게 정렬한 후 genreCntMap
에서 장르를 하나씩 꺼내면서 songMap
을 이용해 해당 장르의 상위 노래 2개씩을 answer
에 추가해주면 된다.
key
값 기준으로 오름차순으로 정렬된다. 따라서 value
기준으로 정렬하려면 따로 방법이 있음!map
을 vector
로 이동map
을 같은 데이터형의 vector
에 초기화 해주기//1. 선언과 따로 초기화
map<string,int> genreCntMap;
vector<pair<string,int>> genreCntVector;
genreCntVector.assign(genreCntMap.begin(), genreCntMap.end());
//2. 선언과 동시에 초기화
map<string,int> genreCntMap;
vetor<pair<string,int>>genreCntVector(genreCntMap.begin(), genreCntMap.end());
bool compareGenreCntMap(pair<string,int> a, pair<string,int> b){
return a.second > b.second; // 재생횟수를 기준으로 내림차순으로 정렬
}
sort(genreCntVector.begin(),genreCntVector.end(),compareGenreCntMap);
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
struct Song{
int playCnt; int Id;
Song(int a, int b){playCnt=a;Id=b;}
bool operator<(const Song &b)const{
if(playCnt!=b.playCnt) return playCnt>b.playCnt; //재생횟수 내림차순
return Id<b.Id; //고유번호 오름차순
}
};
bool compareGenreCntMap(pair<string,int> a, pair<string,int> b){
return a.second > b.second; // 재생횟수를 기준으로 내림차순으로 정렬
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map<string, vector<Song>> songMap; //<장르, vector(재생횟수,고유번호)>
map<string,int> genreCntMap; //<장르, 재생횟수>
for(int i=0;i<genres.size();i++){
songMap[genres[i]].push_back(Song(plays[i],i));
genreCntMap[genres[i]]+=plays[i];
}
//1. songMap의 각 key(장르)마다 value인 Song들을 정렬
for(auto it=songMap.begin();it!=songMap.end();it++){
sort((it->second).begin(), (it->second).end());
}
//2. genreCntMap의 value인 재생 횟수를 내림차순 정렬
vector<pair<string,int>> genreCntVector(genreCntMap.begin(), genreCntMap.end()); //정렬하기 위해 map을 vecotr로 이동
sort(genreCntVector.begin(),genreCntVector.end(),compareGenreCntMap);
for(int i=0;i<genreCntVector.size();i++){
string genre=genreCntVector[i].first; //이 장르를 가지고.. SongMap에서 찾아서 고유번호 찾기!
for(int j=0;j<songMap[genre].size();j++){
if(j>=2) break; //2개 까지
answer.push_back(songMap[genre][j].Id); // ✨value vector의 j번째 원소의 Id
}
}
return answer;
}