2022. 9. 17. 00:11ㆍAlgorithm/프로그래머스
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 |