장르 | 1 | 2 | 3 | 합 |
---|---|---|---|---|
classic | 500 | 150 | 800 | 1450 |
pop | 600 | 2500 | 3100 |
이렇게 생기게 됩니다!
해쉬맵의 키는 장르, 값은 노래 플레이 수 입니다.
결국 답은 = [4, 1, 3, 0]이 됩니다.
키 = 장르, 값 = 플레이 횟수 벡터
와[이하 a맵], 키 = 장르, 값 = 플레이 총합
[이하 b맵] 2개를 구성했습니다.#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>
using namespace std;
class Test {
public:
int num;
int plays;
Test(int num = 0, int plays = 0) {
this->num = num;
this->plays = plays;
}
};
bool contains(unordered_map<string, vector<Test>>& target, string key) {
return (target.find(key) != target.end());
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
unordered_map<string, vector<Test>> map_array;
unordered_map<string, int> each_size;
// Input to map
for (int i = 0; i < genres.size(); i++) {
if (!contains(map_array, genres[i])) {
map_array.insert(make_pair(genres[i], vector<Test>{Test(i, plays[i])}));
each_size.insert(make_pair(genres[i], plays[i]));
} else {
each_size[genres[i]] += plays[i];
map_array[genres[i]].push_back(Test(i, plays[i]));
}
}
// Sort map itself
for (auto it = map_array.begin(); it != map_array.end(); it++) {
sort(it->second.begin(), it->second.end(), [](Test one, Test two) {
if (one.plays == two.plays) {
return one.num < two.num;
}
return one.plays > two.plays;
});
}
// Sort
vector<pair<string, int>> sorted_vector(each_size.begin(), each_size.end());
sort(sorted_vector.begin(), sorted_vector.end(), [](pair<string, int> one, pair<string, int> two) {
return one.second > two.second;
});
for (int i = 0; i < sorted_vector.size(); i++) {
string key_name = sorted_vector[i].first;
vector<Test>& value_using = map_array[key_name];
if (value_using.size() < 2) {
answer.push_back(value_using[0].num);
} else {
answer.push_back(value_using[0].num);
answer.push_back(value_using[1].num);
}
}
return answer;
}