C++:: 프로그래머스 <베스트앨범>

jahlee·2023년 3월 28일
0

프로그래머스_Lv.3

목록 보기
1/29
post-thumbnail

앨범 곡 수록순서의 조건은
총 플레이 횟수가 많은 장르가 먼저 수록되어야 하고 해당 장르 내에서는 각각 플레이가 많이된 순서이다. 각 곡의 플레이 횟수가 같다면 genres에 등록된 인덱스 순으로 한다.

#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

map<string, int> m_cnt, m_plays;

int compare(tuple<string,int,int> a, tuple<string,int,int> b)
{
    if (m_plays[get<0>(a)] == m_plays[get<0>(b)]) return get<1>(a) > get<1>(b);//같은 장르면 각 플레이횟수로 비교
    return m_plays[get<0>(a)] > m_plays[get<0>(b)];// 다른 장르면 총 플레이 횟수로 비교
}
vector<int> solution(vector<string> genres, vector<int> plays)
{
    vector<int> answer;
    vector<tuple<string,int,int>> v;
    for(int i=0;i<genres.size();i++)
    {
        if(m_cnt[genres[i]] < 2) m_cnt[genres[i]]++;// 장르별 최대 2곡만 수록할것이기 때문에
        m_plays[genres[i]] += plays[i];// 총 플레이 횟수
        v.push_back({genres[i], plays[i], i});// 튜플로 {장르명, 플레이 횟수, 해당 인덱스}를 저장
    }
    sort(v.begin(), v.end(), compare);
    for(auto c : v)
    {
        if(m_cnt[get<0>(c)])//해당 장르 곡선정 개수가 남아있다면
        {
            answer.push_back(get<2>(c));//해당 인덱스 추가
            m_cnt[get<0>(c)]--;//곡선정 개수--
        }
    }
    return answer;
}

0개의 댓글