프로그래머스 베스트 앨범 c++ map

2023. 10. 25. 19:10알고리즘

    vector<int> answer;
    map<string, int> m;
    map<int, string, greater<int>> M;

    for (int i = 0;i < genres.size();i++) {
        m[genres[i]] += plays[i];
    }

    for (auto it : m) { 
        M[it.second] = it.first;
    }

 

M 이라고 선언한 map에 많이 재생된 순서로 노래를 정렬했다.

 

Map은 key 값을 기반으로 정렬이 되므로 key로 정렬한 후에 벡터로 담아서 다시 정렬을 해야한다.

이때 정렬을 위한 boolean 함수를 작성했다.

 

#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

bool cmp(pair<int, int> a, pair<int, int> b) {
    if (a.first != b.first) {
        return a.first > b.first;
    }
    return a.second < b.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, int> m; // 장르, 재생횟수
    map<int, string, greater<int>> M; // 재생횟수, 장르

    for (int i = 0;i < genres.size();i++) {
        m[genres[i]] += plays[i];
    }

    for (auto it : m) { 
        M[it.second] = it.first;
    }

    for (auto it : M) {
        vector<pair<int, int>> v; //재생횟수, 고유번호 
        for (int i = 0;i < genres.size();i++) {
            if (genres[i] == it.second) {
                v.push_back({ plays[i] , i});
            }
        }

        sort(v.begin(), v.end(), cmp);
  
        if (v.size() >= 2) {
            for (int i=0;i<2;i++){
                answer.push_back(v[i].second);
            }
        }
        else {
            answer.push_back(v[0].second);
        }
    }
    return answer;
}

int main(void) {
    vector<string> g = { "classic", "pop", "classic", "classic", "pop" };
    vector<int> p = { 500, 600, 150, 800, 2500 };
    solution(g, p);
    return 0;
}