#include <string>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
bool genlistSort(pair<string, int> a, pair<string, int> b)
{
return a.second > b.second;
}
bool playslistSort(pair<int, int> a, pair<int, int> b)
{
//어차피 기본정렬이 오름차순이여서 필요가 없었다.
//if(a.first > b.first)
//{
// return a.first > b.first;
//}
//else if(a.first == b.first)
//{
// return a.second < b.second;
//}
return a.first > b.first;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map<string, int> genlist; //값 받는용
vector<pair<string, int>> genlistv;
for(int i = 0; i < genres.size(); i++) //값을 받아온다.
genlist[genres[i]] += plays[i];
genlistv.assign(genlist.begin(),genlist.end()); //vector에 복사
sort(genlistv.begin(), genlistv.end(), genlistSort); //값기준 정렬
for(int i = 0; i < genlistv.size(); i++) //장르순으로 높은 값
{
vector<pair<int, int>> playslist; //노래 정렬용
string currGenres = genlistv[i].first;
for(int j = 0; j < genres.size(); j++)
{
if(genres[j] == currGenres) //장르가 같다면
playslist.push_back({plays[j], j});
}
sort(playslist.begin(), playslist.end(), playslistSort);
for(int j = 0; j < playslist.size() && j < 2; j++) //상위 두개만 넣는다.
{
answer.push_back(playslist[j].second);
}
}
return answer;
}
풀이
- 해당 장르의 총합 구해서 장르별로 내림차순으로 정렬해서 가장 많이 재생된 장르 순서 구하기
- 그 순서를 편하게 정렬하기 위해 vector에 복사해서 정렬할 수 있게 만든다
- 많이 재생된 장르에서 값들과 고유번호를 모두 받아와서 많이 재생된 순으로 정렬해서 두개 뽑기
- 재생수가 같을 경우 고유번호가 낮은순으로 정렬한다 (기본 내림차순으로 정렬하여 값을 비교하고 나머지는 내림차순으로 자동으로 정렬됨)
- 나온 두개를 정답에 장르별로 순서대로 넣는다.
배워갈 점
- map을 정렬할 때 번거롭다면 vector로 치환해서 정렬하기
- 기본이 내림차순이면 조건문 값으로 정렬후 나머지 값은 내림차순으로 정렬됨
- v1.assign(v2.begin(),v2.end());으로 해당 vector에 자료형이 같은 다른 값들을 집어 넣을 수 있다.
- 변수명들이 비슷할 경우 조심하여 생각하고 쓴다.
추가 테스트
값이 같을 경우 낮은 고유번호순으로 먼저 수록
'Algorithm > Programmers' 카테고리의 다른 글
[C++] 프로그래머스 문자열 압축 2020 KAKAO BLIND RECRUITMENT (0) | 2021.04.28 |
---|---|
[C++] 프로그래머스 카카오 1차 온라인 코딩테스트 5번 문제 뉴스 클러스터링(난이도: 중) (0) | 2021.04.27 |
[C++] 프로그래머스 위장 해시 (0) | 2021.04.26 |
[C++] 프로그래머스 전화번호 목록 해시 (0) | 2021.04.24 |
[C++] 프로그래머스 완주하지 못한 선수 해시 (0) | 2021.04.23 |