코딩테스트 연습
해시
베스트앨범
아래 조건에 부합하는 노래를 담은 앨범을 발매하려고 한다. 장르당 두 곡씩 담을 수 있다. 앨범에 들어갈 노래들의 인덱스 번호를 순서대로 반환하라.
function solution(genres, plays) {
var answer = [];
const len=genres.length
let sumObj={};//장르별 총 스트리밍 수 저장
let songs=[]; //객체 배열
let songCnt=0;
for (let i=0;i<len;i++){
sumObj[genres[i]]=(sumObj[genres[i]]||0)+plays[i];
// sumObj[genres[i]]가 undefined면 false이므로 0+plays[i]가 됨
let obj={};
obj["genre"]=genres[i];
obj["plays"]=plays[i];
obj["idx"]=i;
songs.push(obj);
}
songs.sort((a,b)=> b["plays"]-a["plays"]) //플레이 수로 정렬
songs.sort((a,b)=>sumObj[b["genre"]]-sumObj[a["genre"]])//장르별 정렬
for(let i=0;i<len;i++){
if(i!==0&&songs[i]["genre"]!==songs[i-1]["genre"]) songCnt=0;
//장르가 바뀌면 answer에 push 가능
if(songCnt>=2) continue;//두 곡이 저장되면 장르가 바뀌기 전까지 순서 넘김
songCnt++;
answer.push(songs[i]["idx"])
}
return answer;
}
// sumObj : { classic: 1450, pop: 3100 }
// songs : [
// { genre: 'pop', plays: 2500, idx: 4 },
// { genre: 'pop', plays: 600, idx: 1 },
// { genre: 'classic', plays: 800, idx: 3 },
// { genre: 'classic', plays: 500, idx: 0 },
// { genre: 'classic', plays: 150, idx: 2 }
// ]