[프로그래머스] 베스트 앨범 (c++)

Peace·2021년 6월 26일

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

문제 접근

map을 사용하여 풀었다.
1. 어느 장르가 가장 많이 수록되어있는지 찾기
-> map으로 key로 장르를 넣어주고, value로 장르별로의 합을 넣어주었다. 그래서 내림차순으로 sort를 한 후, 가장 많이 들은 장르부터 탐색했다.
2. 장르들을 뽑아서, sort해주기.
-> 위 방법으로 얻은 장르들에 맞는 플레이수를 고유번호와 함께 저장한 후, sort해서, 앞에서 부터 두 개의 고유번호만 출력했다.

코드 구현(c++)

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

using namespace std;
bool cmp(pair<int, int> a , pair<int, int> b){
    if(a.first > b.first) return true;
    else if(a.first < b.first) return false;
    else{
        if(a.second < b.second) return true;
        else return false;
    }
}
bool map_cmp(pair<string, int> a , pair<string, int> b){
    if(a.second > b.second) return true;
    else return false;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    map<string, int> m;
    for(int i = 0 ; i < genres.size() ; i++){
        if(m.find(genres[i]) !=m.end()){
            m[genres[i]] = m[genres[i]] + plays[i];
   
        }
        else{
            m[genres[i]] = plays[i];
       
        }
    }
    vector<pair<string, int>> v (m.begin(), m.end());
    sort(v.begin(),v.end(), map_cmp);
    for(auto it = v.begin() ; it != v.end() ; it++){
        string temp = it->first;
        vector<pair<int, int> > genres_order;
        int cnt = 0;
        for(int i = 0 ; i < genres.size() ; i++){
            if(genres[i] == temp){
                genres_order.push_back(make_pair(plays[i], i));
            }
        }
        sort(genres_order.begin(), genres_order.end(), cmp);
        for(int i = 0 ; i < genres_order.size() ; i++){
            if(cnt < 2){
                answer.push_back(genres_order[i].second);
                cnt++;
            }
        }
    }
    return answer;
}

느낀점

자바로 풀어보려고 했지만, sort부분과 map 사용하는 것이 c++이 익숙해서, 사고가 먼저 c++로 되어서 해당 언어로 풀게되었다. java를 주언어로 사용하려면, java를 자주 사용하여, 사고를 java로 할 수 있도록 해야겠다.

profile
https://peace-log.tistory.com 로 이사 중

0개의 댓글