스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
노래의 장르를 나타내는 문자열 배열 genres
와 노래별 재생 횟수를 나타내는 정수 배열 plays
가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.
제한사항
입출력 예
genres | plays | return |
---|---|---|
["classic", "pop", "classic", "classic", "pop"] | [500, 600, 150, 800, 2500] | [4, 1, 3, 0] |
입출력 예 설명
classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.
pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.
따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.
노래를 수록하는 기준에 따라 생각해보자.
장르마다 총 플레이 수를 계산해서 총 플레이 수가 높은 장르 먼저 정렬한다.
그렇게 정렬한 장르 내에서 또 플레이 수가 높은 (플레이 수 같다면 고유 번호 낮은 순서로) 노래를 최대 두개 고른다.
소스코드
function solution(genres, plays) {
let totalPlay = new Map();
let genresPlay = new Map();
let answer = [];
// totalPlay에 장르별 총 플레이 수 저장
for (let i=0; i<genres.length; i++) {
if(!totalPlay.has(genres[i])) {
totalPlay.set(genres[i], plays[i]);
} else {
let prePlay = totalPlay.get(genres[i]);
totalPlay.set(genres[i], prePlay + plays[i]);
}
}
// 플레이 수 오름차순 정렬
let descOrder = [...totalPlay];
descOrder.sort((a, b) => b[1] - a[1]);
// 장르 별 플레이 저장
for (let i=0; i<genres.length; i++) {
let pushArr = [i, plays[i]];
if(!genresPlay.has(genres[i])) {
genresPlay.set(genres[i], [pushArr]);
} else {
let preArr = genresPlay.get(genres[i]);
preArr.push(pushArr);
genresPlay.set(genres[i], preArr);
}
}
// 장르별 가장 높은 2개 추출
for (let i=0; i<descOrder.length; i++) {
let playList = genresPlay.get(descOrder[i][0]);
playList.sort((a, b) => b[1] - a[1]);
for(let j=0; j<2; j++) {
if(playList[j] !== undefined) {
answer.push(playList[j][0]);
}
}
}
return answer;
}
사용하면 좋은 다른 함수