https://school.programmers.co.kr/learn/courses/30/lessons/42579
문제

풀이
1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
장르별 노래 재생횟수 map에 {key = 장르명, value = 재생 횟수 합} 형태로 저장한다.
이후 정렬을 할 때는 vector에 옮겨서 수행한다.
cmp2, 정의 함수를 사용해서 내림차순으로 정렬한다.
// 장르별 재생횟수 합 내림차순으로 정렬
vector<pair<string, int>> temp(m2.begin(), m2.end());
sort(temp.begin(), temp.end(), cmp2);
...
bool cmp2(pair<string, int> &a, pair<string, int> &b){
return a.second > b.second; // 재생 횟수 합 내림차순
}
2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
map을 사용해서 장르별로 노래를 구분해서 저장한다. {key = 장르명, value = 노래 저장할 vector}
노래 고유 번호를 이용한 정렬이 필요하기 때문에, pair {고유번호, 재생횟수} 형태로 저장해야한다.
이후 장르 노래를 담은 벡터를 정렬할 때는 cmp1, 정의 함수를 사용한다.
기본은 재생 횟수 내림차순으로, 재생 횟수가 같을 때는 고유 번호 오름차순으로 정렬한다.
bool cmp1(pair<int, int> &a, pair<int, int> &b){
if(a.second == b.second){
return a.first < b.first; // 고유 번호 오름차순
}
return a.second > b.second; // 재생 횟수 내림차순
}
전체 풀이
장르의 곡이 하나라면 하나만 선택해야하는 제한사항을 주의해야한다.
#include <bits/stdc++.h>
using namespace std;
bool cmp1(pair<int, int> &a, pair<int, int> &b){
if(a.second == b.second){
return a.first < b.first; // 고유 번호 오름차순
}
return a.second > b.second; // 재생 횟수 내림차순
}
bool cmp2(pair<string, int> &a, pair<string, int> &b){
return a.second > b.second; // 재생 횟수 합 내림차순
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> ans;
map<string, vector<pair<int, int>>> m1; // 장르별 (고유번호, 재생횟수) 저장
map<string, int> m2; // 장르별 재생횟수 합 저장
// 장르별 음악 저장, 재생횟수 합 저장
for(int i=0; i<genres.size(); i++){
string genre = genres[i];
int play = plays[i];
if(m1.find(genre)!= m1.end()){
m1[genre].push_back({i, play});
m2[genre]+= play;
}
else{
m1.insert({genre, {{i, play}}});
m2.insert({genre, play});
}
}
// 장르별 재생횟수 합 내림차순으로 정렬
vector<pair<string, int>> temp(m2.begin(), m2.end());
sort(temp.begin(), temp.end(), cmp2);
for(auto t: temp){
string genre = t.first;
vector<pair<int, int>> songs = m1[genre];
// 장르 내 정렬
sort(songs.begin(), songs.end(), cmp1);
// 2번째 곡까지 추가
for(int i=0; i<songs.size() && i<2; i++){
ans.push_back(songs[i].first);
}
}
return ans;
}
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [PG / C++] 프로그래머스 스티커 모으기 (2) (0) | 2025.03.20 |
|---|---|
| [PG / C++] 프로그래머스 가장 큰 수 (0) | 2025.02.18 |
| [PG / C++] 프로그래머스 등굣길 (0) | 2025.02.15 |
| [PG / C++] 프로그래머스 의상 목록 (0) | 2025.02.12 |
| [PG / C++] 프로그래머스 전화번호 목록 (0) | 2025.02.11 |