map을 사용하여 풀었다.
1. 어느 장르가 가장 많이 수록되어있는지 찾기
-> map으로 key로 장르를 넣어주고, value로 장르별로의 합을 넣어주었다. 그래서 내림차순으로 sort를 한 후, 가장 많이 들은 장르부터 탐색했다.
2. 장르들을 뽑아서, sort해주기.
-> 위 방법으로 얻은 장르들에 맞는 플레이수를 고유번호와 함께 저장한 후, sort해서, 앞에서 부터 두 개의 고유번호만 출력했다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(pair<int, int> a , pair<int, int> b){
if(a.first > b.first) return true;
else if(a.first < b.first) return false;
else{
if(a.second < b.second) return true;
else return false;
}
}
bool map_cmp(pair<string, int> a , pair<string, int> b){
if(a.second > b.second) return true;
else return false;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map<string, int> m;
for(int i = 0 ; i < genres.size() ; i++){
if(m.find(genres[i]) !=m.end()){
m[genres[i]] = m[genres[i]] + plays[i];
}
else{
m[genres[i]] = plays[i];
}
}
vector<pair<string, int>> v (m.begin(), m.end());
sort(v.begin(),v.end(), map_cmp);
for(auto it = v.begin() ; it != v.end() ; it++){
string temp = it->first;
vector<pair<int, int> > genres_order;
int cnt = 0;
for(int i = 0 ; i < genres.size() ; i++){
if(genres[i] == temp){
genres_order.push_back(make_pair(plays[i], i));
}
}
sort(genres_order.begin(), genres_order.end(), cmp);
for(int i = 0 ; i < genres_order.size() ; i++){
if(cnt < 2){
answer.push_back(genres_order[i].second);
cnt++;
}
}
}
return answer;
}
자바로 풀어보려고 했지만, sort부분과 map 사용하는 것이 c++이 익숙해서, 사고가 먼저 c++로 되어서 해당 언어로 풀게되었다. java를 주언어로 사용하려면, java를 자주 사용하여, 사고를 java로 할 수 있도록 해야겠다.