🖥️ CS/SW Expert 외의 Algorithms

(프로그래머스 C++) 베스트앨범

한국의 메타몽 2021. 1. 2. 18:45

문제 링크 : programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

분류 : 해시, 맵 


문제풀이는 다음과 같다. 

1. map을 통해 가장 많이 재생된 노래 종류를 저장한다. 

2. map의 값을 vector에 복사하며, 저장될때 정렬되는 기준은 노래가 가장 많이 저장된 순서이다

3. vector에 저장된 값의 '노래 장르'를 기준으로 순차적으로 노래가 저장된 genres, play와 비교한다. 

    3-(1) 베스트 앨범에 저장될 값은 곡의 장르당 2개 이므로, 2개의 값을 저장한 변수를 별도로 선언한다 (ex : mini, maxi) 

    3-(2) 이때 누적된 재생값과 해당 값의 순서를 기억해줘야 하므로, pair를 통해 값을 저장한다.

 

#include <algorithm>
#include <string>
#include <vector>
#include <map>

using namespace std;

map<string,int> num1;
vector<pair<string,int>> num2;

bool comp(const pair<string,int>& a, const pair<string,int>& b){
    return a.second > b.second;
}

vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    for(int i=0; i<genres.size(); i++){
        num1[genres[i]] += plays[i];
    }
    for(auto[m,n] : num1) num2.push_back(make_pair(m,n));
    sort(num2.begin(),num2.end(),comp);
    for(int i=0; i<num2.size(); i++){
        pair<int,int> maxi; pair<int,int> mini;
        for(int j=0; j<genres.size(); j++){
            if(num2[i].first==genres[j]){
                if(maxi.first<plays[j]){
                    mini.first = maxi.first; // 점수
                    maxi.first = plays[j];
                    mini.second = maxi.second; //순서
                    maxi.second = j;
                }
                else if(mini.first<plays[j]) mini.first = plays[j], mini.second=j;
            }
        }
        if(mini.first!=0){
            answer.push_back(maxi.second); 
            answer.push_back(mini.second);
        }
        else answer.push_back(maxi.second);
    }
    return answer;
}