소근소근

[프로그래머스 - 베스트앨범] 해시 C++ 본문

Algorithm

[프로그래머스 - 베스트앨범] 해시 C++

JJureng 2022. 1. 6. 20:21
728x90
반응형
SMALL
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <map>

using namespace std;
map <string , int> genKey;
map <int , int> getCount; 
vector <pair<int,int>> genNum;
vector<pair<int,int>> v[100]; 

bool comp(const pair<int,int>&a , const pair<int,int>&b){
    if(a.first == b.first)
        return a.second > b.second;
    return a.first < b.first;
}
vector<int> solution(vector<string> gen, vector<int> plays) {
    vector<int> answer;
    int tmp = 0; 
    for(int i=0;i<gen.size();i++){
        string gen_name = gen[i];
        if(genKey.find(gen_name) == genKey.end()){
            genKey[gen_name] = ++tmp;
            getCount[tmp] = plays[i];
        }else{
            int exist = genKey[gen_name];
            getCount[exist] += plays[i];
        }
    } 
    for(int i=1;i<=tmp;i++){
        int cnt = getCount[i]; 
        genNum.push_back({cnt,i}); // {장르별 음악 수 , 장르 key}
    }
    for(int i=0;i<gen.size();i++){
        string gen_name = gen[i];
        int gennum = genKey[gen_name];
        v[gennum].push_back({plays[i] , i}); //{재생 횟수 , 인덱스}
    }
    sort(genNum.begin(),genNum.end());
    reverse(genNum.begin(),genNum.end()); //내림차순 정렬을 위해서
    
    for(int i=0;i<genNum.size();i++){
        int gennum = genNum[i].second;
        sort(v[gennum].begin(),v[gennum].end() , comp); //custom sort
        
        if(v[gennum].size() == 1){
            answer.push_back(v[gennum][0].second);
            continue;
        }
        int cnt = 1;
        for(int j= v[gennum].size()-1 ; cnt<=2 ;j--){
            answer.push_back(v[gennum][j].second);
            cnt ++;
        }
    }
    return answer;
}

vector <pair<int,int>> 에서 음악 재생 수는 오름차순, 음악 인덱스는 내림차순으로 정렬하기 위해 custom sort를 해주었다.

 

케이스 다 맞긴 했지만 코드가 마음에 들진 않는다 ..

 

예외처리 하는거 까먹어서 계속 틀리다가 나중에 발견했다. 

1) 음악 재생 수가 같을 때는 작은 인덱스 먼저,

2) 장르에 음악이 한 개 일때는 하나만 출력한다

728x90
반응형
LIST