[프로그래머스/C++] 베스트앨범

mani·2023년 1월 5일
0

베스트앨범

compare은 vector<pair<int,int>>로
생성할때 sum_v(genre_sum.begin(), genre_sum.end())
sort할때 & 주소를 넣어야 수정됨
playlist의 second가 vector이므로 장르별 곡에 대한 정렬은 ele.second.begin()

장르별로 노래 재생 수 합이 큰 장르부터
장르 안의 노래 재생 수가 큰 장르부터
같은 노래 재생 수라면 고유번호가 낮은 노래 먼저

장르1 - {고유번호, 재생수}, {고유번호, 재생수}
장르2 -

umap<string, <int,int>>
umapSum<string, int>

해당 장르에 plays를 계속 더함
umap에 pair로 고유번호랑 추가
umapSum에서 가장 큰 int부터 선택 후 제거
해당 string key를 가지는 umap에서
plays value 값이 큰 값부터 찾은 후 제거
만일 같은 값이면 고유번호 낮은 노래 먼저

장르별 2곡까지만 수록

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

using namespace std;

bool comp_sum(pair<string, int> a, pair<string, int> b){
    return a.second > b.second;
}

bool comp_play(pair<int, int> a, pair<int, int> b){
    return a.second > b.second;
}

vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    
    unordered_map<string, vector<pair<int,int>>> playlist;
    unordered_map<string, int> genre_sum;
    
    for(int i=0;i<genres.size();i++){
        playlist[genres[i]].push_back(make_pair(i,plays[i])); 
        genre_sum[genres[i]] += plays[i];
    }
    
    vector<pair<string, int>> genre_sum_v(genre_sum.begin(), genre_sum.end());
    sort(genre_sum_v.begin(), genre_sum_v.end(), comp_sum);
    
    for(auto &ele : playlist){
        sort(ele.second.begin(), ele.second.end(), comp_play);
    }

    for(auto ele : genre_sum_v){
        int size = playlist[ele.first].size();
        for(int i=0;i<min(2, size);i++){
            answer.push_back(playlist[ele.first][i].first);
        }
    }

        
    return answer;
}

#include <iostream>
#include <vector>
#include <map>

using namespace std;

map<string, map<int,int>> umap;
map<string, int> umapSum;


vector<int> solution(vector<string> genres, vector<int> plays) {
	vector<int> answer;

	for (int i = 0; i < genres.size(); i++) {
		umap[genres[i]][i] = plays[i];
		umapSum[genres[i]] += plays[i];
	}

	while (umap.size() > 0) {
		int playesMax = 0;
		string genresMax = "";
		for (auto genre : umapSum) {
			if (genre.second > playesMax) {
				genresMax = genre.first;
				playesMax = genre.second;
			}
		}
		for (int i = 0; i < 2; i++) {
			
			if (umap[genresMax].size() == 0)break;

			int plays = 0;
			int index = -1;
			
			for (auto music : umap[genresMax]) {
				if (music.second > plays) {
					plays = music.second;
					index = music.first;
				}
			}
			answer.push_back(index);
			umap[genresMax].erase(index);
		}
		umap.erase(genresMax);
		umapSum.erase(genresMax);
	}

	return answer;
}


int main(void)
{

	vector<string> genres = { "classic", "pop", "classic", "classic", "pop" };
	vector<int> plays = { 500, 600, 150, 800, 2500 };
	
	vector<int> answers = solution(genres, plays);
	for(auto answer:answers)
		cout << answer<<" ";
	return 0;
}


#include <iostream>
#include <vector>
#include <map>

using namespace std;

map<string, map<int,int>> umap;
map<string, int> umapSum;


vector<int> solution(vector<string> genres, vector<int> plays) {
	vector<int> answer;

	for (int i = 0; i < genres.size(); i++) {
		umap[genres[i]][i] = plays[i];
		umapSum[genres[i]] += plays[i];
	}

	while (umap.size() > 0) {
		int playesMax = 0;
		string genresMax = "";
		for (auto genre : umapSum) {
			if (genre.second > playesMax) {
				genresMax = genre.first;
				playesMax = genre.second;
			}
		}
		for (int i = 0; i < 2; i++) {
			
			if (umap[genresMax].size() == 0)break;

			int plays = 0;
			int index = -1;
			
			for (auto music : umap[genresMax]) {
				if (music.second > plays) {
					plays = music.second;
					index = music.first;
				}
			}
			answer.push_back(index);
			umap[genresMax].erase(index);
		}
		umap.erase(genresMax);
		umapSum.erase(genresMax);
	}

	return answer;
}


int main(void)
{

	vector<string> genres = { "classic", "pop", "classic", "classic", "pop" };
	vector<int> plays = { 500, 600, 150, 800, 2500 };
	
	vector<int> answers = solution(genres, plays);
	for(auto answer:answers)
		cout << answer<<" ";
	return 0;
}
profile
log

1개의 댓글

comment-user-thumbnail
2023년 1월 5일

map과 unordered_map의 차이
https://gyong0.tistory.com/70

답글 달기