풀이
[문제 풀이]
이 문제는 stl중 map을 사용하면 쉽게 풀 수 있는 문제다.
map을 이용해 장르별로 재생 횟수를 더해 계산을 한다. 그리고 map을 하나 더 만들어 장르별로 index의 위치와 재생횟수를 저장하는 vector를 value로 만든다.
이렇게 두개의 map을 만든 뒤, 장르별 재생 횟수를 저장한 map을 vector로 변환해 정렬한다.
재생 횟수가 많은 순서대로 정렬된 map을 이용해 가장 재생횟수가 많은 장르부터 for문을 돌린다.
for문을 돌리면서 장르별로 index와 재생횟수가 저장된 map을 다시 재생횟수 순서로 정렬하면 된다.
(이때, 장르별로 index와 재생 횟수를 vector에 넣을때 index가 작은 것 부터 들어가므로 크기 비교는 play 횟수가 더 많은 경우로만 비교해도 된다.)
정렬을 마치면 그 장르의 곡의 index를 push하고 for문이 끝나면 return하면 된다.
[아이디어 정리]
- map을 사용해 장르별 재생횟수를 구한다음 정렬한다.
- map을 사용해 장르별 플레이 index와 재생횟수를 저장하고 정렬한다.
- 앞에서 구한 재생횟수가 많은 순서대로 for문을 돌려 vector에 push한 다음 return한다.
Code
#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map<string,int> genreMap;
map<string,vector<pair<int,int>>> genreSort;
for (int i=0; i<genres.size(); i++)
{
genreMap[genres[i]]+=plays[i];
genreSort[genres[i]].push_back(make_pair(i,plays[i]));
}
vector<pair<string,int>> genreV(genreMap.begin(),genreMap.end());
sort(genreV.begin(),genreV.end(),[](pair<string,int> a, pair<string,int> b)
{
return a.second>b.second;
});
for (int i=0; i<genreV.size(); i++)
{
sort(genreSort[genreV[i].first].begin(),genreSort[genreV[i].first].end(),[](pair<int,int> a, pair<int,int>b) {
return a.second>b.second;
});
for (int j=0; j<genreSort[genreV[i].first].size(); j++)
{
if (j==2)
break;
answer.push_back(genreSort[genreV[i].first][j].first);
}
}
return answer;
}
Map을 vector로 변환하면 vector에 pair로 저장되는 것만 주의하면 되는 문제다
그리고 rambda 함수에 조금씩 익숙해져보자...
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 보석 쇼핑 (0) | 2024.02.07 |
---|---|
[프로그래머스/C++] 등대 (0) | 2024.02.07 |
[프로그래머스/C++] 보행자 천국 (2017 카카오코드 예선) (0) | 2024.02.04 |
[프로그래머스/C++] N으로 표현 (0) | 2024.02.02 |
[프로그래머스/C++] 재밌는 레이싱 경기장 설계하기 (2023 현대모비스 알고리즘 경진대회 본선) (0) | 2024.02.02 |