[Programmers] 베스트 앨범(Lv.3)(C++)

Alice·2023년 8월 20일
0

풀이 소요시간 : 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;
}
profile
SSAFY 11th

0개의 댓글