[프로그래머스/C++] 베스트 앨범
(7/15 - O)
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
베스트 앨범에 수록될 곡의 고유번호를 answer에 담아야 한다.
구현
map 두 개, vector 두 개를 이용해서 풀었다. 이하 m1, m2, v1, v2이다.
1. 가장 많이 플레이된 장르를 구한다.
1.1 m1에 (key)장르, (value)플레이 횟수를 누적하여 담는다. map의 key는 중복되지 않음을 이용한다.
1.2 map을 value 기준으로 정렬해야 한다. --> v1에 이동시킨 후 second 기준으로 내림차순 sorting(lamda 이용)한다.
1.3 v1[0].first가 가장 많이 플레이된 장르이다.
1.4 m1에서 value가 v1[0].first인 원소를 삭제한다.
2. 가장 많이 플레이된 장르 내 곡들을 두 개 또는 한 개를 뽑는다.
2.1 가장 많이 플레이된 장르에 해당하는 곡들을 m2에 (key)고유번호, (value)플레이 횟수로 담는다.
2.2 map을 value 기준으로 정렬한다. --> v2에 이동시킨 후 second 기준으로 내림차순 sorting 한다.
2.3 v2의 사이즈가 2보다 작으면 v2의 사이즈만큼 앞에서부터 answer에 넣고, v2의 사이즈가 2보다 크면 앞에서부터 2개의 원소를 answer에 넣는다.
3. m1이 empty 상태인가? Y->4, N->1
4. answer를 반환한다.
실수 (코드 상에 표시)
1. 장르에 곡이 꼭 2개 이상 있는 게 아니다. 1개일 경우를 고려해야 한다.
2. 같은 장르 내에 플레이 횟수가 같은 곡이 있다면 고유 번호가 낮은 순으로 뽑는다.
코드
#include <string>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
// 베스트 앨범에 들어갈 노래의 고유번호를 순서대로 리턴!
vector<int> solution(vector<string> genres, vector<int> plays) {
vector<int> answer;
int song_cnt = genres.size();
// 1. 가장 많이 플레이된 장르는?
map<string, int> m1;
for (int i = 0; i < song_cnt; i++) {
m1[genres[i]] += plays[i];
}
int genres_cnt = m1.size();
int while_cnt = 0;
while (!m1.empty()) {
vector < pair<string, int >> v1(m1.begin(), m1.end());
sort(v1.begin(), v1.end(), [](const pair<string, int>& p1, const pair<string, int>& p2) {
return p1.second > p2.second;
});
string maxplay_genre = v1[0].first;
m1.erase(maxplay_genre);
// 2. 가장 많이 플레이된 장르 중에서 가장 많이 플레이된 곡 두 개를 뽑아서 고유번호를 push
map<int, int> m2; // first 고유번호, second 플레이 횟수
for (int i = 0; i < song_cnt; i++) {
if (genres[i] == maxplay_genre) {
m2[i] = plays[i];
}
}
vector<pair<int, int>> v2(m2.begin(), m2.end());
sort(v2.begin(), v2.end(), [](const pair<int, int>& p1, const pair<int, int>& p2) {
if (p1.second == p2.second) { // 실수 2
p1.first < p2.first;
}
else {
return p1.second > p2.second;
}});
int song_cnt = m2.size();
for (int i = 0; i < song_cnt; i++) { // 실수1
if (i >= 2) break;
answer.push_back(v2[i].first);
}
}
return answer;
}