반응형
풀이 코드
#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#이랑 람다 식을 작성하는 방법이 달랐다.
- 해당 문제를 풀면서 필요한 자료형을 찾다가 pair라는것을 알게 됨.
반응형
'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 |