[콭] 베스트앨범 Hash

강원지·2023년 2월 24일
0

코테 다시보기

목록 보기
14/22

코딩테스트 연습
해시
베스트앨범

문제

아래 조건에 부합하는 노래를 담은 앨범을 발매하려고 한다. 장르당 두 곡씩 담을 수 있다. 앨범에 들어갈 노래들의 인덱스 번호를 순서대로 반환하라.

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

javascript 코드

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 }
// ]

0개의 댓글