https://school.programmers.co.kr/learn/courses/30/lessons/42579
1. m을 정렬하고
2. music을 재생 횟수로 정렬하고
3. m을 한 개씩 읽으면서 반복
4. music에선 두 개 넘으면 break (1개일 때도 있어서 2번으로 반복 돌리면 안됨)
auto :
"타입추론"
값에 따라 알아서 데이터 타입을 정해주는 키워드
const auto :
상수 취급이라 값을 변경할 수 없음 + 알아서 데이터 타입 정해줌
unordered_map :
hash_map -> unordered_map
순서 상관없이 저장. 해시 테이블을 사용해 키의 순서를 유지하지 않는 자료구조.
자료의 양이 적을 땐 vector나 list가 나음
vector::assign :
벡터에 새로운 내용을 넣음. 벡터 객체에 이전에 있었던 원소들은 모두 삭제하고, 인자로 받은 새로운 내용을 저장.
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
bool cmp(pair<int, int> a, pair<int, int> b);
bool cmp_value(pair<string, int> a, pair<string, int> b);
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
unordered_map<string, vector<pair<int, int>>> m;
unordered_map<string, int> music;
vector<pair<string, int>> v;
for (int i = 0; i < genres.size(); i++) {
m[genres[i]].push_back(make_pair(plays[i], i));
music[genres[i]] += plays[i];
}
for (auto& k : m)
sort(k.second.begin(), k.second.end(), cmp);
v.assign(music.begin(), music.end());
sort(v.begin(), v.end(), cmp_value);
for (int i = 0; i < v.size(); i++) {
string name = v[i].first;
for (int j = 0; j < m[name].size(); j++) {
if (j >= 2) break;
answer.push_back(m[name][j].second);
}
}
return answer;
}
bool cmp(pair<int, int> a, pair<int, int> b) {
return a.first > b.first;
}
bool cmp_value(pair<string, int> a, pair<string, int> b) {
return a.second > b.second;
}