https://programmers.co.kr/learn/courses/30/lessons/42579

Source

    vstr vstrGenre;
    vi viPlays;

  void _Solve(){
        typedef std::pair<int, vii> i_vii;
        typedef std::vector<i_vii> vivii;
        vivii viviiTotVecPlaysId;

        typedef std::unordered_map<string, int> hash_str_i;
        hash_str_i hash_striGenreIdx;

        int genreCnt = 0;
        FOR(i, vstrGenre.size()){
            string genre = vstrGenre[i];
            int plays = viPlays[i];
            hash_str_i::iterator it = hash_striGenreIdx.find(genre);
            if (it == hash_striGenreIdx.end()) {
                vii viiTotVecPlaysId;
                viiTotVecPlaysId.push_back(ii(plays, i));
                viviiTotVecPlaysId.push_back(i_vii(plays, viiTotVecPlaysId));
                hash_striGenreIdx.insert(str_i(genre, genreCnt++));
            }
            else {
                // vivii[hash->int].vii.push_back()
                viviiTotVecPlaysId[it->second].second.push_back(ii(plays, i));
                // vivii[hash->int].int+=plays
                viviiTotVecPlaysId[it->second].first+=plays;
            }
        }

        std::sort(viviiTotVecPlaysId.begin(), viviiTotVecPlaysId.end(),
        [](const i_vii &a, const i_vii &b){
            return a.first > b.first;
        });
        vi viPick;
        for (auto i_viiTotVecPlaysId : viviiTotVecPlaysId) {
            auto viiPlaysId = i_viiTotVecPlaysId.second;
            std::sort(viiPlaysId.begin(), viiPlaysId.end(),
            [](const ii &a, const ii &b){
                if (a.first == b.second) {
                    return a.second < b.second;
                }
                return a.first > b.first;
            });
            for (int j=0; (j<2) && (j<viiPlaysId.size()); ++j) {
                viPick.push_back(viiPlaysId[j].second);
            }
        }
        for (auto id : viPick) {
            cout << id << " ";
        }
    } // Solve
  void _Solve_arch(){
        typedef std::pair<int, vii> i_vii;
        typedef std::vector<i_vii> vivii;
        vivii viviiTotVecPlaysId;

        typedef std::pair<string, i_vii> str_ivii;
#if 0   // only key can be compared... the code below is not possible
        struct cmp {
            bool operator()(const str_ivii &a, const str_ivii &b) const {
                return a.second.first > b.second.first;
            }
        };
        typedef std::map<string, i_vii, cmp> hash_str_ivii;
#else
        typedef std::unordered_map<string, i_vii> hash_str_ivii;
#endif
        hash_str_ivii hash_striviiGenre;

        int genreCnt = 0;
        FOR(i, vstrGenre.size()){
            string genre = vstrGenre[i];
            int plays = viPlays[i];
            hash_str_ivii::iterator it = hash_striviiGenre.find(genre);
            if (it == hash_striviiGenre.end()) {
                vii viiTotVecPlaysId;
                viiTotVecPlaysId.push_back(ii(plays, i));
                hash_striviiGenre.insert(str_ivii(genre, i_vii(plays, viiTotVecPlaysId)));
            }
            else {
                // hash->ivii.vii.push_back()
                it->second.second.push_back(ii(plays, i));
                // hash->ivii.int
                it->second.first+=plays;
            }
        }

        hash_str_ivii::iterator it = hash_striviiGenre.begin();
        for (; it!=hash_striviiGenre.end(); ++it) {
            viviiTotVecPlaysId.push_back(
                // hash->ivii.int, hash->ivii.vii
                i_vii(it->second.first, it->second.second));
        }

#if 0 // Impossible to sort a map
        std::sort(hash_striviiGenre.begin(), hash_striviiGenre.end(),
        [](const string &a, const string &b){
            return a.length() > b.length();
        });
#else
        std::sort(viviiTotVecPlaysId.begin(), viviiTotVecPlaysId.end(),
        [](const i_vii &a, const i_vii &b){
            return a.first > b.first;
        });
#endif
        vi viPick;
        for (auto i_viiTotVecPlaysId : viviiTotVecPlaysId) {
            auto viiPlaysId = i_viiTotVecPlaysId.second;
            std::sort(viiPlaysId.begin(), viiPlaysId.end(),
            [](const ii &a, const ii &b){
                if (a.first == b.second) {
                    return a.second < b.second;
                }
                return a.first > b.first;
            });
            for (int j=0; (j<2) && (j<viiPlaysId.size()); ++j) {
                viPick.push_back(viiPlaysId[j].second);
            }
        }
        for (auto id : viPick) {
            cout << id << " ";
        }
    } // Solve

GitHub

BestAlbum