본문 바로가기

Algorithm/문제풀이

Programmers - 베스트앨범 / Javascript

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;
}