풀이 소요시간 : 20분
Lv.3
치고는 체감상 쉬웠다. 카카오 기출문제
를 풀면서 map
사용에 익숙해져서 인지 몰라도, 요즘 기본적인 STL 을 다루는 실력이 향상된 것 같다. map
자료구조만 잘 사용할 줄 알아도 구현이 간단한 문제였다. 별다른 머리를 굴려야하는 포인트는 없었다.
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
unordered_map<string, vector<pair<int, int>>> Map;
unordered_map<string, int> Sum;
vector<int> Ans;
//재생 수가 많은 순 -> 고유 번호가 낮은순으로 내림차순
bool Cmp_1(pair<int, int>& A, pair<int, int>& B) {
if(A.first == B.first)
{
return A.second < B.second;
}
return A.first > B.first;
}
//총 재생 수가 많은 순으로 내림차순
bool Cmp_2(pair<string, int>& A, pair<string, int>& B) {
return A.second > B.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
for(int i = 0; i < genres.size(); i++)
{
// {재생수, 고유번호}
Map[genres[i]].push_back({plays[i], i});
Sum[genres[i]] += plays[i];
}
for(auto& E : Map)
{ //재생 횟수 내림차순 정렬
sort(E.second.begin(), E.second.end(), Cmp_1);
}
//총 재생 수 내림차순 정렬
vector<pair<string, int>> Vector(Sum.begin(), Sum.end());
sort(Vector.begin(), Vector.end(), Cmp_2);
for(int i = 0; i < Vector.size(); i++)
{
string Gen = Vector[i].first;
Ans.push_back(Map[Gen][0].second);
if(Map[Gen].size() > 1) Ans.push_back(Map[Gen][1].second);
}
return Ans;
}