N
(프로그래머스 JS)베스트 앨범 본문
https://programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
해시를 이용한 문제 풀이.
gSum 객체는 각 장르의 총 플레이 횟수를 담는다.
gIndex 객체는 각 장르의 곡마다 플레이 횟수와 인덱스를 담는다.
우선 각 장르 별 총 플레이 횟수와 인덱스를 알아야 한다.
for문을 통해 genres와 plays의 원소에 접근.
만약 gSum 객체에서 genre를 key로 가지고 있지 않다면(undefined) 0으로 초기화 한다.
해당 value에 플레이 횟수(play)를 더해주도록 한다.
또한, 인덱스를 알기 위해 gIndex 객체에서 genre를 key로 가지고 있지 않다면(undefined) 해당 value를 배열로 초기화 한다.
해당 장르의 플레이 횟수(play)와 인덱스(i)를 gIndex[genre]에 push.
for문이 끝나면 정렬을 해준다.
gSum은 가장 많이 플레이 된 장르 순서로 나타내야 하기 때문에 새로운 배열 sortedGenre를 선언한다.
(gSum은 객체로 되어 있기 때문에 배열로 바꾼 후, 정렬 진행)
sort를 통해 내림차순으로 정렬을 한다.
gIndex 또한 정렬을 해야 한다.
같은 장르라도 플레이 횟수가 많은 순서, 횟수가 같으면 인덱스가 낮은 순서로 정렬을 해야 한다.
이 또한 sort() 함수를 통해 진행.
이제 정렬된 sortedGenre에서 차례대로 장르를 선택해,
gIndex에서 해당 key를 가진 노래 2곡을 answer에 넣으면 된다.
만약, gIndex[key]의 length가 2 이하라면 곡이 하나밖에 없다는 뜻이므로 하나만 넣어주면 된다.
function solution(genres, plays) {
const answer = [];
const gSum = {};
const gIndex = {};
const len = genres.length;
for(let i = 0; i < len; i++){
const genre = genres[i];
const play = plays[i];
if(gSum[genre] === undefined){
gSum[genre] = 0;
}
gSum[genre] += play;
if(gIndex[genre] === undefined){
gIndex[genre] = [];
}
gIndex[genre].push([play, i]);
}
const sortedGenre = [];
const sortedPlay = [];
for(const key in gSum){
sortedGenre.push([key, gSum[key]]);
}
for(const arr in gIndex){
gIndex[arr].sort((a, b) => b[0] - a[0]);
}
sortedGenre.sort((a, b) => b[1] - a[1]);
for(const k of sortedGenre){
const genre = k[0];
if(gIndex[genre].length < 2){
answer.push(gIndex[genre][0][1]);
}
else{
answer.push(gIndex[genre][0][1]);
answer.push(gIndex[genre][1][1]);
}
}
return answer;
}
'프로그래머스 알고리즘 > 3단계' 카테고리의 다른 글
(프로그래머스 JS)섬 연결하기 (0) | 2021.11.10 |
---|---|
(프로그래머스 JS)가장 먼 노드 (0) | 2021.08.04 |
(프로그래머스 c++)거스름돈 (0) | 2021.03.15 |
(프로그래머스 c++)풍선 터트리기 (0) | 2020.10.13 |
(프로그래머스 c++) N-Queen (0) | 2020.09.21 |