[JavaScript] 베스트앨범

2022. 9. 17. 00:11Algorithm/프로그래머스

level : 3
문제 링크 : 베스트앨범

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

My Solution

function solution(genres, plays) {
    let answer = [];
    const len = genres.length;
    let genre = [];
    let list = {};
    for(let i = 0; i < len; i++){
        const g = genres[i];
        if(genre.includes(g))
            list[g].push([i,plays[i],list[g][list[g].length-1][2]+plays[i]]);
        else{
            list[g] = [[i,plays[i],plays[i]]];
            genre.push(g);
        }
    }
    genre.sort((a,b)=>list[b][list[b].length-1][2] - list[a][list[a].length-1][2]);
    for(let i in list){
        list[i].sort((a,b)=>b[1]-a[1]);
    }
    for(let i of genre){
        answer.push(list[i][0][0]);
        if(list[i].length>1)
            answer.push(list[i][1][0]);
    }
    return answer;
}


풀이방법
genre는 장르를 우선순위별로 저장할 배열이다.
list는 각 장르마다의 [index, value, total]의 형태의 배열을 갖는 2차원 배열이다.

반복문을 통하여 아래의 과정(genre에 원소 추가 및 list에 값 추가)을 이
i번째 genres의 값을 g로 지정하고 genre에 g가 있으면 list에도 값이 있기에 list[g]에 [i, plays[i], 가장 최근 값의 total + plays[i]]를 push한다.
만약 g가 없다면 list[g]에 [[i, plays[i], plays[i]]값을 생성하고 genre에 g를 push한다.

이후에는 list에서 각각의 장르의 배열 중 마지막 index의 total값을 이용하여 장르를 정렬해준다.
또한 list의 value로 정렬한다.
마지막으로 각 장르별로 list의 첫 번째와 두 번째 값을 answer에 push한다. 이때 두 번째 값이 없을 경우 첫 번째 값만 push한다.

느낀점
평소에는 Map이라는 자료구조를 잘 사용하였지만 이번 문제에서는 Object를 사용하였다. 이유는 간단하였다.
Map에서 value가 배열이고 그 배열에 추가를 하려면 spread operator(...)을 이용하여 원소들을 나열한 다음에 다시 배열을 새로 만들어 set해야한다.
이 과정의 코드가 난잡해 보여 사용하지 않았다.

'Algorithm > 프로그래머스' 카테고리의 다른 글

[JavaScript] 다음 큰 숫자  (0) 2022.09.25
[JavaScript] 야근 지수  (0) 2022.09.17
[JavaScript] N개의 최소공배수  (0) 2022.09.16
[JavaScript] 최고의 집합  (0) 2022.09.16
[JavaScript] 피보나치 수  (0) 2022.09.15