https://school.programmers.co.kr/learn/courses/30/lessons/42579
/*
map에 장르별로 묶는다.
vector<GenreInfo>로 옮긴다.
장르는 총 재생수 기준 정렬한다.
장르 내부 노래는 재생수 내림차순, 같으면 인덱스 오름차순 정렬한다.
앞에서 2개만 뽑는다.
*/
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct Song{
int play;
int idx;
};
struct GenreInfo{
string name;
int totalPlay = 0;
vector<Song> songs;
};
bool CompareGenre(const GenreInfo& lGenre, const GenreInfo& rGenre){
return lGenre.totalPlay > rGenre.totalPlay;
}
bool CompareSong(const Song& lSong, const Song& rSong){
if(lSong.play == rSong.play){
return lSong.idx < rSong.idx;
}
return lSong.play > rSong.play;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map<string, GenreInfo> genreMap;
//장르별 총 재생수와 노래 목록 저장
for(int idx = 0; idx < genres.size(); ++idx){
string genreName = genres[idx];
genreMap[genreName].name = genreName; // 생략해도 되나 디버깅용
genreMap[genreName].totalPlay += plays[idx];
genreMap[genreName].songs.push_back({plays[idx], idx});
}
//map -> vector로 옮기기
vector<GenreInfo> genreList;
for(auto& item : genreMap){
genreList.push_back(item.second); // map의 value값 넣기
}
//장르 총 재생수 내림차순 정렬
sort(genreList.begin(), genreList.end(), CompareGenre);
//각 장르 안에서 노래 정렬 후 2개 씩 선택
for(auto& currentGenre : genreList){
sort(currentGenre.songs.begin(), currentGenre.songs.end(), CompareSong);
//songIdx < size() 조건은 장르의 plays 갯수가 1일 경우가 존재하기에 (1<=plays<=10000)
for(int songIdx = 0; songIdx<currentGenre.songs.size() && songIdx < 2 ; songIdx++){
answer.push_back(currentGenre.songs[songIdx].idx);
}
}
return answer;
}'프로그래머스 > 코딩테스트' 카테고리의 다른 글
| 카카오 lv1) 신규 아이디 추천 (2) | 2026.04.22 |
|---|---|
| LV4 sql) 상품을 구매한 회원 비율 구하기 (0) | 2026.04.18 |
| SQL LV4) 년, 월, 성별 별 상품 구매 회원 수 구하기[다시] (0) | 2026.04.15 |
| SQL LV2) 조건에 맞는 아이템들의 가격의 총합 구하기 (0) | 2026.04.15 |
| SQL LV3) 주문량이 많은 아이스크림들 조회하기 (0) | 2026.04.13 |
