반응형
// 장르 순위 매기기
// 해당 장르에서 많이 재생된 노래 순위 매기기
// 재생된 노래가 같다면 고유번호 낮은것을 앞으로
function solution(genres, plays) {
var answer = [];
const object = {};
for(let id = 0; id < genres.length; id++ ){
const genre = genres[id];
const count = plays[id];
if( object[genre] === undefined ) object[genre] = { sum: 0, plays: [] }
object[genre].sum += count;
object[genre].plays.push( { id, count } );
};
let sortedArr = Object.entries(object).sort( (a, b) => {
// sum을 기준으로 내림차순
return b[1].sum - a[1].sum
})
sortedArr.forEach( arr => {
// 많이 재생된 노래 내림차순,
// 재생된 노래수가 같으면 고유 번호가 낮은 노래 먼저 수록
const playsArr = arr[1].plays.sort( ( a, b ) => {
if(a.count === b.count){
if(a.id < b.id) return -1;
else return 1;
} else if( a.count > b.count) return -1;
else return 1;
});
// 최대 2개의 곡만 수록
playsArr.slice(0,2).forEach( play => answer.push( play.id ))
})
return answer;
}
문제 설명
베스트 앨범을 만드는 규칙은 다음과 같습니다.
1. 장르 순위 별로
2. 해당 장르에서 많이 재생된 노래 순위 별로( 재생된 수가 같다면 고유번호가 낮은게 앞으로 )
그렇다면 결국 베스트 앨범을 배열로 표현 하면 [ 1 순위 장르에서 노래 최대 2개 , 2 순위 장르에서 노래 최대 2개 , ... N 순위 장르에서 노래 최대 2개 ] 가 됩니다.
*노래가 1개라면 1개만 넣어주면 됩니다.
접근
1. 각 장르별로 재생 수를 기준으로 내림차순 정렬
2. 각 장르별로 노래를 재생 수 기준으로 내림차순 정렬 ( 재생 수가 같다면 고유번호가 낮은게 앞으로)
3. 정렬이 끝나면 재생 수가 높은 장르부터 해당 장르의 재생 수가 높은 노래 2개를 베스트 앨범에 넣기
데이터 구조
object = {
classic: { sum: 1450, plays: [ [Object], [Object], [Object] ] },
pop: { sum: 3100, plays: [ [Object], [Object] ] }
}
Object.entries(object) 결과 값
[
[ 'classic', { sum: 1450, plays: [Array] } ],
[ 'pop', { sum: 3100, plays: [Array] } ]
]
Object.entries는 object를 array로 변환시켜주는 함수로 첫 번째 인덱스에 object key의 이름 두 번째 인덱스에는 object value의 값을 넣은 배열들을 담고 있는 배열을 생성한다.