문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
접근방법
고민을 많이 했다. level 3인 만큼 생각할 게 많았다.
1. 장르별로 plays수를 저장해야하고, 그것을 정렬할 수 있어야했다.
Map에 우선 저장해놓고, vector<string, int>로 받아와 comparator1를 이용해 정렬했다.
map에 우선 저장을 해놓은 이유는 plays수를 합산하기 편해서이다.
2. plays수가 가장 많은 장르를 불러왔을 때, 그 장르에 속한 노래들의 고유번호를 알아내야 했다.
그리고 그 노래들을 정렬해서 플레이 수 많은 순으로 2개 씩 뽑아야 했다.
쉬운 방법이 없을까 고민했지만, 그냥 3개 데이터를 합쳐서 struct gpi를 만들어 해결했다.
코드
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
struct gpi {
string genres;
int plays;
int idx;
};
bool comparator2(gpi A, gpi B) {
return A.plays > B.plays;
}
bool comparator1(pair<string, int> A, pair<string, int> B) {
return A.second > B.second;
}
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
map<string, int> genres_count;
vector<gpi > genres_plays;
vector<pair<string, int> > genres_count_sorted;
for (int i=0;i<genres.size();i++) {
genres_count[genres[i]] += plays[i];
gpi temp;
temp.genres = genres[i]; temp.plays = plays[i]; temp.idx = i;
genres_plays.push_back(temp);
}
for (auto& gcpair : genres_count) {
genres_count_sorted.push_back(make_pair(gcpair.first, gcpair.second));
}
sort(genres_count_sorted.begin(), genres_count_sorted.end(), comparator1);
sort(genres_plays.begin(), genres_plays.end(), comparator2);
for (auto gcs : genres_count_sorted) {
int cnt = 0;
for (int i=0;i<genres.size();i++) {
if (genres_plays[i].genres == gcs.first) {
answer.push_back(genres_plays[i].idx);
cnt++;
}
if (cnt == 2) break;
}
}
return answer;
}
개선할 점
좀 더 쉬운 접근이 있을 거 같은 데 알아봐야겠다.
struct와 sort는 너무 유용하다. 고민하지 말고 익숙해지도록 자주 쓰자.
'코딩테스트 준비 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 가장 큰 수(정렬) c++ (0) | 2024.02.14 |
---|---|
[프로그래머스] - k번째 수(정렬) c++ (1) | 2024.02.14 |
[프로그래머스] - 의상(해시) c++ (0) | 2024.02.14 |
[프로그래머스] - 전화번호 목록(해시) c++ (0) | 2024.02.14 |
[프로그래머스] - 포켓몬(해시) c++ (0) | 2024.02.14 |