[ 프로그래머스 ] 베스트앨범
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
풀이
장르와 고유 번호로 구분된 노래를 재생 순으로 정렬하여 장르 별 가장 많이 재생된 노래 2개를 선택하는 문제로, 주어진 배열을 정렬하여 원하는 값을 retrun한다. 정렬은 장르 별 재생순, 같은 장르의 노래 별 재생 순으로 이루어지고, 같은 재생이라면 고유 번호 순으로 정렬하고 이를 순서대로 2개씩 뽑아 배열에 넣어 return한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
vector<int> playList;
bool ano_cmp(const pair<string, int>& a, const pair<string, int>& b)
{
if (playList[a.second] == playList[b.second])
{
return a.first > b.first;
}
return playList[a.second] > playList[b.second];
}
bool cmp(const pair<string, int>& a, const pair<string, int>& b)
{
if (a.second == b.second)
{
return a.first > b.first;
}
return a.second > b.second;
}
vector<int> solution(vector<string> genres, vector<int> plays)
{
vector<int> answer;
map<string, int> list;
vector<pair<string, int >> s_list;
playList = plays;
for (int i = 0; i < genres.size(); i++)
{
if (list.find(genres[i]) != list.end())
{
list[genres[i]] += plays[i];
s_list.push_back(make_pair(genres[i], i));
}
else
{
list.insert({ genres[i], plays[i] });
s_list.push_back(make_pair(genres[i], i));
}
}
vector<pair<string, int >> vec(list.begin(), list.end());
sort(vec.begin(), vec.end(), cmp);
sort(s_list.begin(), s_list.end(), ano_cmp);
for (int i = 0; i < vec.size(); i++)
{
int limit = 0;
for (int j = 0; j < genres.size(); j++)
{
if (limit == 2)
{
break;
}
if (vec[i].first == s_list[j].first)
{
answer.push_back(s_list[j].second);
limit++;
}
}
}
return answer;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.