-
해시 알고리즘 문제 : 프로그래머스 LEVEL 3(베스트 앨범)) - 사용 언어 : C++ - 해결 날짜 : 2021-02-18
**- 해결 방법** : - 처음에 문제를 잘 못 이해하여 가장 많이 재생된 노래 두 개씩을 모아 총 4개만 베스트 앨범에 수록하는 것 인줄 알았다. 그리고 하나의 map에 고유 번호와 재생된 횟수를 담는 법을 고민하는데 시간이 좀 걸렸다. - 우선 각 장르별 재생 횟수를 담을 m1(총 합), 각 장르별 고유번호와 재생 횟수를 담을 m2 map을 선언하여 for문을 돌며 추가해주었다. 그 후 노래가 가장 많이 재생된 장르를 찾아 그 장르 내에서 많이 재생된 노래 최대 2개를 찾아 answer vector에 추가하는 과정을 통해 문제를 해결하였다. 만일 두개의 노래를 찾는 중 노래가 없거나 한 개 밖에 없는 경우라면 break로 다음 장르로 넘어가도록 하였다. 베스트 앨범에 들어갈 노래를 찾아 고유번호를 추가 후 삭제하고, 마찬가지로 최대 2개씩 노래를 추가한 앨범은 erase 함수로 삭제하였다. - 코드 ```c++
#include
#include #include <map> using namespace std; vector<int> solution(vector<string> genres, vector<int> plays) { vector<int> answer; map<string, int> m1; map<string, map<int, int>> m2; //각 장르별 재생 횟수를 담고, 각 장르별 고유번호와 재생횟수를 담음 for(int i = 0; i<genres.size(); i++){ m1[genres[i]] += plays[i]; m2[genres[i]][i] = plays[i]; } //노래가 가장 많이 재생된 장르를 찾아 그 장르 내에서 많이 재생된 노래(최대 2개)를 찾아 answer에 추가 while(m1.size() > 0){ string genre; int max = 0; for(auto temp : m1){ //현재 노래가 가장 많이 재생된 장르를 찾음 if(temp.second > max){ max = temp.second; genre = temp.first; } } for(int i = 0; i<2; i++){ int numOfPlays = 0; int index = -1; for(auto temp : m2[genre]){ //장르 내에서 많이 재생된 노래를 찾음 if(temp.second > numOfPlays){ numOfPlays = temp.second; index = temp.first; } } //두 개의 노래를 찾는 중 노래가 없거나 한 개뿐이라면 break if(index < 0) break; //베스트 앨범에 들어갈 노래의 고유번호를 추가 후 삭제 answer.push_back(index); m2[genre].erase(index); } //베스트 앨범에 들어갈 노래를 다 추가한 장르는 삭제 m1.erase(genre); } return answer; } ```