본문 바로가기
Algorithm/프로그래머스

Level3. 프로그래머스 베스트앨범 - JavaScript

by 강깅꽁 2020. 10. 28.
반응형

 

// 장르 순위 매기기
// 해당 장르에서 많이 재생된 노래 순위 매기기
// 재생된 노래가 같다면 고유번호 낮은것을 앞으로 

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의 값을 넣은 배열들을 담고 있는 배열을 생성한다.