https://school.programmers.co.kr/learn/courses/30/lessons/42579
풀이과정
먼저, 장르별로 재생횟수, 고유번호를 같이 m1 맵에 넣어주고
장르별로 재생횟수의 합을 m2 맵에 넣어준다.
- cmp 함수
m1의 맵을 돌면서 재생횟수가 같으면 고유번호를 오름차순해주고,
재생횟수가 다르면 재생횟수를 내림차순해준다.
(여기서 auto &x : m1은 x를 m1의 요소에 대한 참조로 가져오기 위해 &를 사용한다. 원본을 변경하기 위해서는 참조를 사용해야 합니다.)
- cmp1 함수
v 벡터에 m2의 값들을 넣어주고
장르별로 재생횟수 내림차순을 해준다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
bool cmp(pair<int, int> v1, pair<int, int> v2){
// 재생횟수 같으면 고유번호 오름차순
if (v1.first == v2.first)
return v1.second < v2.second;
// 재생횟수 내림차순
else return v1.first > v2.first;
}
bool cmp1(pair<string, int> v1, pair<string, int> v2){
// 장르 재생횟수 합 내림차순
return v1.second > v2.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map <string, vector <pair<int, int>>> m1; // 장르, 재생횟수, 고유번호
map <string, int> m2; // 장르별 재생횟수 합
for(int i = 0; i < genres.size(); i++){
m1[genres[i]].push_back({plays[i], i});
m2[genres[i]] += plays[i];
}
// 재생횟수 같으면 고유번호 오름차순, 다르면 재생횟수 내림차순
for (auto &x : m1){
sort(x.second.begin(), x.second.end(), cmp);
}
vector <pair<string, int>> v(m2.begin(), m2.end());
sort(v.begin(), v.end(), cmp1);
for(auto x : v){
for(int i = 0; i < m1[x.first].size(); i++){
answer.push_back(m1[x.first][i].second);
if(i) break;
}
}
return answer;
}
'🍞 Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스][Level2] 다리를 지나는 트럭 c++ (0) | 2024.02.21 |
---|---|
[프로그래머스][Level3] 네트워크 c++ (0) | 2022.10.21 |
[프로그래머스][Level3] 가장 먼 노드 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 행렬의 곱셈 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 피로도 c++ (0) | 2022.10.21 |