[lv3] 베스트앨범

걸음걸음·2023년 3월 24일
0

Test

목록 보기
23/29

문제 링크

  • 노래의 장르를 나타내는 문자열 배열 genres

  • 노래별 재생 횟수를 나타내는 정수 배열 plays

  • 고유 번호가 i인 노래의 장르와 재생횟수는 genres[i], plays[i]

  • 속한 노래가 많이 재생된 장르 순서

  • 위 조건이 같을 경우 장르 내에서 많이 재생된 노래 순서

  • 위 조건이 같을 경우 고유 번호가 낮은 노래 순서

  • 장르별로 최대 두개까지 노래 삽입

  • 이러한 조건으로 수록된 순서의 고유 번호를 return

function solution(genres, plays) {
    // 장르별로 재생횟수 구하기
    // 해당 장르 내에서 재생횟수 구하기
    // 재생횟수가 같을 경우 고유 번호 순으로
    const total = {} // 장르별 재생횟수를 구하기 위한 변수
    const songs = [] // 노래의 장르와 고유번호, 재생횟수를 담을 변수
    genres.forEach((ele, i)=>{
      	total[ele] ? total[ele] += plays[i] : total[ele] = plays[i]
        const song = {genre : ele, index:i, play:plays[i]};
        songs.push(song)
    })
    
    const totalArr = Object.entries(total) // total 배열화
    // 재생횟수 순서로 정렬
    totalArr.sort((a,b)=>b[1]-a[1]);
    songs.sort((a,b)=>b.play - a.play);
    const answer = [];
    for(let i = 0; i<totalArr.length; i++){
      	// 장르가 앞에 있는 순서대로 필터(첫번째조건)
		// 재생횟수가 높은 순서로 두개만 구하기(장르별 두곡만 수록 조건)
      	// 해당 배열의 index(고유번호)만 구해서 answer에 push
        const temp = songs.filter((ele)=> ele.genre === totalArr[i][0]).slice(0,2).map((ele)=>ele.index)
        answer.push(...temp)
    }
    return answer;
}

같은 장르이고 재생횟수도 같을 경우 고유번호가 낮은 순서로 정렬하는 로직 잊은걸 모든 테스트가 통과하고 이렇게 정리하면서 깨달았다
처음부터 index 순서로(고유번호 순으로) 되어있던 것에서 재생횟수를 기준으로 재정렬을 했을 뿐이니 해당 로직은 따로 손대지 않는 이상 처음부터 구현되어 있다

다른 사람의 풀이

function solution(genres, plays) {
    var dic = {};
    genres.forEach((t,i)=> {
        dic[t] = dic[t] ?  dic[t] + plays[i] :plays[i];        
    });

    var dupDic = {};
    return genres
          .map((t,i)=> ({genre : t, count:plays[i] , index:i}))
          .sort((a,b)=>{               
               if(a.genre !== b.genre) return dic[b.genre] - dic[a.genre];
               if(a.count !== b.count) return b.count - a.count;
               return a.index - b.index;
           })
           .filter(t=>  {
               if(dupDic[t.genre] >= 2) return false;
               dupDic[t.genre] = dupDic[t.genre] ? dupDic[t.genre]+ 1 : 1;
               return true;
            })
           .map(t=> t.index);    
}

따로 변수를 만들지 않고 장르의 순서만 정렬한 후 map, sort, filter로 전부 해결한 코드
sort를 정말 잘 활용한 것 같다

profile
꾸준히 나아가는 개발자입니다.

0개의 댓글