본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level3] 베스트 앨범

by Benjamin_Choi 2022. 1. 4.

/**
 * 베스트 앨범
 * 해시
 * https://programmers.co.kr/learn/courses/30/lessons/42579?language=javascript
 */

function solution(genres, plays) {    
    let answer = [];
    const maxTotal = {}, maxGenre = {};

    genres.forEach((genre, idx) => {
        !maxTotal[genre] ? maxTotal[genre] = plays[idx] : maxTotal[genre] += plays[idx];
        !maxGenre[genre] ? maxGenre[genre] = [{value: plays[idx], index: idx}] : maxGenre[genre].push({value: plays[idx], index: idx});
    });

    Object.keys(maxTotal).map((genre) => {
        return { name: genre, total: maxTotal[genre] };
    })
    .sort((a, b) => b.total - a.total)
    .forEach((obj) => {
        maxGenre[obj.name].sort((a, b) => b.value - a.value);
        for (let i = 0; i<2; i++) {
            const top = maxGenre[obj.name][i];
            if (top) answer = answer.concat(top.index);
        }
    });
    return answer;
}

console.log(solution(["classic", "pop", "classic", "classic", "pop"], [500, 600, 150, 800, 2500]));

sort 를 사용할 때 모두 내림차순 처리해줬는데,

forEach 함수 내부의 두 번째 sort의 경우 내림차순으로 하지 않을 경우 플레이 횟수가 같은 곡 중 index 가 우선되는 값이 뒤로 밀리면서 2가지 테스트 케이스 통과를 못한다. 유의하자. 

댓글