반응형

 

 

 

 

풀이 코드

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

#define MAX 2

vector<pair<string, int>> GetSortedGenres(const vector<string>&, const vector<int>&);
unordered_map<string, vector<pair<int, int>>> GetSortedPlays
(const vector<pair<string, int>>&, const vector<string>&, const vector<int>&);

vector<int> solution(vector<string> genres, vector<int> plays) {
	
    //재생 수를 기준으로 내림차순으로 정렬 된 장르의 벡터를 가져온다.
    vector<pair<string, int>> genresVec = GetSortedGenres(genres, plays);
    //재생 수를 기준으로 내림차순으로 정렬 된 장르별 곡의 맵을 가져온다.
    unordered_map<string, vector<pair<int, int>>> playsMap = GetSortedPlays(genresVec, genres, plays);

    vector<int> answer;
    for(int i = 0; i < genresVec.size(); i++)
    {
        for(int j = 0; j < playsMap[genresVec[i].first].size() && j < MAX; j++)
        {
            //반환할 결과 값(벡터)에 장르별 곡의 길이(혹은 최대 2곡)까지 넣어준다.
            answer.push_back(playsMap[genresVec[i].first][j].first);
        }
    }

    return answer;
}

vector<pair<string, int>> GetSortedGenres(const vector<string>& genres, const vector<int>& plays)
{
    unordered_map<string, int> genresMap;
    for(int i = 0; i < genres.size() && i < plays.size(); i++)
    {
        genresMap[genres[i]] += plays[i];
    }

    //값(value)를 기준으로 내림차순 정렬을 해주기위해 map을 vector로 바꿔준다.
    vector<pair<string, int>> pVector;
    for(auto& it : genresMap)
    {
        pVector.push_back(it);
    }
	
    //내림차순 정렬(람다 사용)
    sort(pVector.begin(), pVector.end(), [](auto& p1, auto& p2)
    {
        return p1.second > p2.second;
    });

    return pVector;
}

unordered_map<string, vector<pair<int, int>>> GetSortedPlays
(const vector<pair<string, int>>& pairVec, const vector<string>& genres, const vector<int>& plays)
{
    unordered_map<string, vector<pair<int, int>>> map;
    for(int i = 0; i < genres.size() && i < plays.size(); i++)
    {
        map[genres[i]].push_back(make_pair(i, plays[i]));
    }

    for (auto& it : map)
    {
    	//map의 장르(Key)에 해당하는 곡(value(pair))들을 내림차순으로 정렬(람다 사용)
        sort(it.second.begin(), it.second.end(), [](auto& v1, auto& v2)
        {
            //곡의 플레이수가 같으면 고유번호를 기준으로 오름차순 정렬한다.
            if (v1.second == v2.second)
            {
                return v1.first < v2.first;
            }

            return v1.second > v2.second;
        });
    }

    return map;
}
  • 각 곡 장르와 장르별 곡을 정렬해 반환하는 함수를 나눠 작성했지만, 반환 함으로써 값 복사가 일어나므로 solution에 다 작성하거나, 힙에 할당했으면 좀 더 좋았을 것 같다.

 

 

 

 

기타

- Lv3은 처음 풀어봤는데, Lv1, Lv2와 다르게 코드가 너무 길어져서 잘못하고 있는줄 알았다.

- C#이랑 람다 식을 작성하는 방법이 달랐다.

 

C++ 람다 식

자세한 정보: c + +의 람다 식

docs.microsoft.com

- 해당 문제를 풀면서 필요한 자료형을 찾다가 pair라는것을 알게 됨.

 

pair 구조체

자세한 정보: pair 구조

docs.microsoft.com

 

 

 

 

 

반응형

'Stack > Coding test' 카테고리의 다른 글

[C++ / Lv2] 프린터  (0) 2022.02.15
[C++ / Lv2] 기능개발  (0) 2022.02.15
[C++ / Lv2] 위장  (0) 2022.02.07
[C++ / Lv2] 전화번호 목록  (0) 2022.02.05
[C++ / Lv1] 완주하지 못한 선수  (0) 2022.02.04

+ Recent posts