스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
제한사항
Map을 정렬하는 연습을 많이 하는 문제였던것 같다... 핵심은 이중 Map!
장르를 key, {고유번호: 재생횟수}를 value로 하는 Map을 생성하면서 장르 내 재생횟수가 같을 경우 고유번호가 낮은 순서부터, 다를 경우 재생횟수가 높은 순서부터 나열한다.
function solution(genres, plays) {
var answer = [];
let hash = new Map();
for(let i=0; i<genres.length; i++){
if(hash.has(genres[i])){
hash.set(genres[i], new Map([...hash.get(genres[i]),
[i, plays[i]]].sort((a, b) => (
a[1] === b[1]? a[0] - b[0] : b[1] - a[1]
))))
} else {
hash.set(genres[i], new Map([[i, plays[i]]]))
};
};
hash = new Map([...hash.entries()].sort((a, b) => (
Array.from(b[1].values()).reduce((a, b) => a + b, 0) - Array.from(a[1].values()).reduce((a, b) => a + b, 0)
)));
hash.forEach((value) => {
const arr = Array.from(value.keys())
answer.push(arr[0]);
if(value.size > 1){
answer.push(arr[1]);
};
});
return answer;
}
Map을 정렬하는 방법
[...map].sort((a, b) => b[1] - a[1]); // 두번째 요소 기준으로 내림차순 정렬
[...map].sort((a, b) => a[0] - b[0]); // 첫번째 요소 기준으로 오름차순 정렬