const solution = (genres, plays) => {
// 장르별 총합
const genresSum = genres.reduce((obj, genre, i) => {
obj[genre] = obj[genre]? obj[genre] + plays[i] : plays[i]
return obj;
}, {});
// 장르 순서 정렬
const sortedGenres = Object.entries(genresSum).sort((a, b) => b[1] - a[1]).map((genre) => genre[0]);
// 장르명, 플레이수, 고유번호, 장르순서로 새로운 배열 생성
const sortedPlays = plays.map((playNum, i) => {
const genreOrder = sortedGenres.indexOf(genres[i]);
return [genres[i], playNum, i, genreOrder];
});
// 먼저 장르 순서로 정렬 후 다시 플레이수로 정렬함
sortedPlays.sort((a,b) => a[3] - b[3]).sort((a, b) => {
//장르가 같은 경우에만 서로 비교
if(a[0] === b[0]){
//플레이 수가 같은 경우 고유번호가 낮은 노래 먼저 수록
if(a[1] === b[1]) {
return a[2] - b[2]
} else {
return b[1] - a[1]
}
}});
//장르별로 두곡까지만 배열로가지는 object 생성
const album = sortedPlays.reduce((obj, music) => {
const genre = [music[0]];
if(obj[genre]) {
if(obj[genre].length === 2){
return obj;
} else {
obj[genre] = [...obj[genre], music[2]];
return obj;
}
} else {
obj[genre] = [music[2]];
return obj;
};
}, {});
const answer = sortedGenres.reduce((arr, genre) => {
return [...arr, ...album[genre]];
}, []);
return answer;
}