문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
플레이 횟수가 더 많은 장르의 음악 중 상위 2개 음악씩 뽑아 플레이 리스트를 만드는 문제였다.
문제 풀이
레벨 3의 문제여서 어려울 줄 알았는데 생각보다 쉬웠다. map에 저장하고.. vector 정렬만 해주면 끝! 별다른 오류도 없었다. 하하.
코테 준비를 하면서 프로그래머스의 알고리즘 고득점 kit의 문제를 푸는 중인데 이 문제로 해시 문제는 다 풀었다. 우하하
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
map<string, vector<pair<int,int>>> genreMap;
map<string, int> genreCount; //각 장르별 전체 재생 횟수
bool compare(pair<int,int> a, pair<int,int> b){ //재생횟수 높은순, 고유번호 낮은순
if(a.first == b.first){
return a.second < b.second;
}
return a.first > b.first;
}
bool compareStringPair(pair<string,int> a, pair<string,int> b){
return a.second > b.second;
}
void initMap(vector<string> genres, vector<int> plays){
for(int i=0;i<genres.size();i++){
if(genreMap.count(genres[i]) == 0){ //처음 넣는것
vector<pair<int,int>> v;
v.push_back({plays[i], i});
genreMap.insert({genres[i], v});
genreCount.insert({genres[i], plays[i]});
}
else{
genreMap[genres[i]].push_back({plays[i],i});
genreCount[genres[i]]+=plays[i];
}
}
}
void printMap(){
for(auto iter:genreMap){
for(int i=0;i<iter.second.size();i++){
cout<<"재생횟수: "<<iter.second[i].first<<" 고유번호: "<<iter.second[i].second<<endl;
}
}
cout<<endl;
}
void sortMap(){
for(auto iter:genreMap){
vector<pair<int,int>> v(iter.second.begin(), iter.second.end());
sort(v.begin(), v.end(), compare);
genreMap[iter.first] = v;
}
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
initMap(genres, plays);
// printMap();
sortMap();
// printMap();
vector<pair<string,int>> genreCountList(genreCount.begin(), genreCount.end());
sort(genreCountList.begin(), genreCountList.end(), compareStringPair);
for(int i=0;i<genreCountList.size();i++){
int flag = 0;
string genreName = genreCountList[i].first;
vector<pair<int,int>> playList(genreMap[genreName].begin(), genreMap[genreName].end());
for(int j=0;j<playList.size();j++){
if(flag >=2) break;
answer.push_back(playList[j].second);
flag++;
}
}
return answer;
}