[Refresh ! 코딩 테스트 / js] -베스트앨범

정대만·2025년 2월 5일

문제 해석

  • 해시 문제임
  • 원래는 시간 초과를 대비하기위해서 map 이나 set 을 사용해야되는데
  • 요구하는 가지수가 적어서 그냥 우선 sort 으로 돌려보자 하고 돌려봤다.
  • 장르별 sort / play수 sort 식으로 작동하면 풀리는 문제임

나의 풀이

function solution(genres, plays) {
  
 // 장르 설정
    // 노래 선정
    // 고유번호 판단
    
    // 장르를 판단하기 위해 처음에는 object 형식으로 장르를 판단하자 
    // 
    let genr_obj={}
    for(var i=0; i<genres.length; i++){
        if(!genr_obj[genres[i]]) genr_obj[genres[i]]=[plays[i],[plays[i],i]]
        else{
            // 있는 경우라면 , plays 을 더하자 
            genr_obj[genres[i]][0]+=plays[i]
             genr_obj[genres[i]].push([plays[i],i])
        }
    }
    const genr_to_obj_arr= Object.values(genr_obj);
   genr_to_obj_arr.sort((a,b)=>b[0]-a[0]);
    let answer=[];
   for(var i=0; i<genr_to_obj_arr.length; i++){
       genr_to_obj_arr[i].shift()
       genr_to_obj_arr[i].sort((a,b)=>  b[0]-a[0]);
       // 한다음에 
       
       // 최대 2개까지니까
       for(var ii=0; ii<2; ii++){
           if( genr_to_obj_arr[i][ii]){
              
               answer.push(genr_to_obj_arr[i][ii][1])
           }
       }
   }
    return (answer)
    
}

남의 코드

function solution(genres, plays) {
  const genreCountMap = new Map();
  const albumsWithIndex = genres.map((genre, idx) => ({
    genre,
    playCount: plays[idx],
    idx,
  }));

  albumsWithIndex.forEach(({ genre, playCount }) => {
    genreCountMap.set(genre, (genreCountMap.get(genre) || 0) + playCount);
  });

  const sortedAlbums = albumsWithIndex.sort((a, b) => {
    if (a.genre !== b.genre)
      return genreCountMap.get(b.genre) - genreCountMap.get(a.genre);
    if (a.playCount !== b.playCount) return b.playCount - a.playCount;
    return a.idx - b.idx;
  });

  const selectedAlbums = new Map();
  const answer = [];

  sortedAlbums.forEach(({ genre, idx }) => {
    const albumCount = selectedAlbums.get(genre) || 0;
    if (albumCount < 2) {
      selectedAlbums.set(genre, albumCount + 1);
      answer.push(idx);
    }
  });

  return answer;
}
profile
안녕하세요

0개의 댓글