포스트

[ 프로그래머스 ] 베스트앨범

문제


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 라이센스를 따릅니다.