문제 링크 : programmers.co.kr/learn/courses/30/lessons/42579
분류 : 해시, 맵
문제풀이는 다음과 같다.
1. map을 통해 가장 많이 재생된 노래 종류를 저장한다.
2. map의 값을 vector에 복사하며, 저장될때 정렬되는 기준은 노래가 가장 많이 저장된 순서이다
3. vector에 저장된 값의 '노래 장르'를 기준으로 순차적으로 노래가 저장된 genres, play와 비교한다.
3-(1) 베스트 앨범에 저장될 값은 곡의 장르당 2개 이므로, 2개의 값을 저장한 변수를 별도로 선언한다 (ex : mini, maxi)
3-(2) 이때 누적된 재생값과 해당 값의 순서를 기억해줘야 하므로, pair를 통해 값을 저장한다.
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
map<string,int> num1;
vector<pair<string,int>> num2;
bool comp(const pair<string,int>& a, const pair<string,int>& b){
return a.second > b.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
for(int i=0; i<genres.size(); i++){
num1[genres[i]] += plays[i];
}
for(auto[m,n] : num1) num2.push_back(make_pair(m,n));
sort(num2.begin(),num2.end(),comp);
for(int i=0; i<num2.size(); i++){
pair<int,int> maxi; pair<int,int> mini;
for(int j=0; j<genres.size(); j++){
if(num2[i].first==genres[j]){
if(maxi.first<plays[j]){
mini.first = maxi.first; // 점수
maxi.first = plays[j];
mini.second = maxi.second; //순서
maxi.second = j;
}
else if(mini.first<plays[j]) mini.first = plays[j], mini.second=j;
}
}
if(mini.first!=0){
answer.push_back(maxi.second);
answer.push_back(mini.second);
}
else answer.push_back(maxi.second);
}
return answer;
}
'🖥️ CS > SW Expert 외의 Algorithms' 카테고리의 다른 글
(LeetCode) 11. Container With Most Water (0) | 2021.01.24 |
---|---|
(LeetCode) 130. Surrounded Regions (0) | 2021.01.17 |
(LeetCode) 17. Letter Combinations of a Phone Number (0) | 2020.11.10 |
(LeetCode) 49. Group Anagrams (0) | 2020.11.09 |
(LeetCode) 70. Climbing Stairs (0) | 2020.10.27 |