슈뢰딩거의 고등어

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

알고리즘

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

슈뢰딩거의 고등어 2022. 4. 16. 18:40

https://programmers.co.kr/learn/courses/30/lessons/42579

 

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

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

programmers.co.kr

 

[풀이방법]

장르별 총횟수를 저장할 map 을 정의합니다. map <string, int> m;

장르별로 노래횟수를 분류할 map 을 정의합니다. map <string, vector <pair<int, int>>> songs;

 

1. genres 를 하나씩 돌면서 위에서 정의한 자료구조에 저장합니다.

2. 장르 중, 플레이 합산이 높은 순으로 정렬합니다.

- map 의 경우 sort 함수를 사용하기 위해서는 vector 구조로 복붙해줘야 합니다.

3. 정렬된 장르들을 하나씩 확인합니다.

4. 장르의 노래를 플레이 횟수가 높은 순으로 분류합니다.

- 내부에 vector 로 정의했으므로 sort 함수를 바로 사용가능합니다.

5. 각 장르별 최대 노래 두 곡을 수록합니다.

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

using namespace std;
//장르 : 총횟수
map <string, int> m;
// 장르 : [{번호, 횟수}...]
map <string, vector <pair<int, int>>> songs;

bool cmp(pair<string, int> a, pair<string, int> b) {
    return a.second >= b.second;
}
//아이디 횟수
bool cmp1(pair<int, int> a, pair<int, 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;
    
    for(int i=0; i<genres.size(); i++) {
        // 새로 등록
        if(m.find(genres[i]) == m.end()) {
            
            vector <pair<int, int>> v; v.clear();
            v.push_back({i, plays[i]});
            songs.insert(make_pair(genres[i], v));
            
            m.insert(make_pair(genres[i], plays[i]));

        }
        else {
            m[genres[i]] += plays[i];
            songs[genres[i]].push_back({i, plays[i]});
        }
    }
    
    vector<pair<string,int>> vec(m.begin(), m.end());
    sort(vec.begin(), vec.end(), cmp);
                     
    for(int i=0; i<vec.size(); i++) {
        string genre = vec[i].first;

        // 아이디, 횟수
        vector <pair<int, int>> song = songs[genre];        
        sort(song.begin(), song.end(), cmp1);

        for(int j=0; j<2 && j<song.size(); j++)
            answer.push_back(song[j].first);
        
    }
    return answer;
}

요즘 카카오코테 문제들만 풀다보니... 문제를 잘 못 풀어서 자신감이 떨어졌는데 이건 그래도 쉽게 맞춰서 좋았다 :)

같은 lv 3 라도 이렇게 차이가 나는걸 보면 확실히 카카오가 어렵긴한가보다

가끔은 쉬운 문제를 풀어서 자신감을 익히는 게 좋을 듯 하다!

Comments