출처 - 프로그래머스 코딩테스트 고득점 KIT
function solution(genres, plays) {
let answer = [];
// STEP 01. 각 장르별로 노래 정보 [인덱스, 재생 횟수] 목록과 총 재생횟수 정보를 모으자!
let mH = new Map();
for (let i = 0; i < genres.length; i++) {
let obj = mH.get(genres[i]) || { musics: [], cnt: 0 };
obj.musics.push([i, plays[i]]);
obj.cnt += plays[i];
mH.set(genres[i], obj);
}
// STEP 02. 각 장르별로 재생 횟수를 sort 하자!
let chart = [];
for (let [genre, info] of mH) {
chart.push([genre, info.musics, info.cnt]);
}
chart.sort((a, b) => b[2] - a[2]);
// STEP 03. 각 장르 내에서 노래들을 순서대로 sort 하자!
for (let genre of chart) {
genre[1].sort((a, b) => {
if (a[1] === b[1]) return a[0] - b[0];
else return b[1] - a[1];
});
// sort한 노래를 각 두 개씩 answer에 모으자!
let idx = 0;
while (genre[1].length > idx && idx < 2) {
answer.push(genre[1][idx][0]);
idx++;
}
}
return answer;
}
{
'classic' => { musics: [ [ 0, 500 ], [ 2, 150 ], [ 3, 800 ] ], cnt: 1450 },
'pop' => { musics: [ [ 1, 600 ], [ 4, 2500 ] ], cnt: 3100 }
}
sort()
를 사용하기 위해 Array로 다시 변환해줘야 한다. function solution(genres, plays) {
var answer = [];
// step 0. 새로운 해시맵 생성하기
let mH = new Map();
// step 1. 각 장르별로 노래 분류하기
for (let i = 0; i < genres.length; i++) {
if (mH.get(genres[i])) {
let temp = mH.get(genres[i]);
mH.set(genres[i], temp.concat([[i, plays[i]]]));
} else {
mH.set(genres[i], [[i, plays[i]]]);
}
}
// step 2. 각 장르별로 1) 재생 횟수 순으로 노래 정렬하기 2) 누적 재생횟수 구하기
let sorted = [];
for (let [key, value] of mH) {
value.sort((a, b) => {
if (a[1] === b[1]) {
return a[0] - b[0];
} else return b[1] - a[1];
});
sorted.push([
key,
value.reduce((acc, cur) => {
return acc + cur[1];
}, 0)
]);
sorted.sort((a, b) => b[1] - a[1]);
}
for (let [genre, play] of sorted) {
let temp = mH.get(genre);
if (temp.length >= 2) {
answer.push(temp[0][0]);
answer.push(temp[1][0]);
} else {
answer.push(temp[0][0]);
}
}
return answer;
}
// STEP 01. 해시맵을 이용하여 장르별로 노래를 분류하되, [고유번호: 재생횟수}]의 형태로 저장한다.
let mH = new Map;
for (let i = 0; i < genres.length; i++) {
mH.set(genres[i], mH.get(genres[i]) ? mH.get(genres[i]).push(i) : [i]);
}
mH.get()
은 object를 반환하기 때문에 .push()
메소드를 쓸 수 없다는 에러가 뜬다!mH.get()
이 반환하는 값을 변수로 한번 더 할당해주고 push()
해야 한다.