-
베스트 앨범Coding Test/Programmers Level 3 2022. 3. 27. 17:25
문제
https://programmers.co.kr/learn/courses/30/lessons/42579
코드
function solution(genres, plays) { const bestAlbum = []; const nominated = genres.reduce((result, genre, index) => { if(!result[genre]) result[genre] = {}; const beforeGenreCount = result[genre]["count"] || 0; result[genre][index] = plays[index]; result[genre]["count"] = beforeGenreCount + plays[index]; return result; }, {}) const sortedNominated = Object.values(nominated).sort((a, b) => b.count - a.count); sortedNominated.forEach((genre) => { delete genre.count; Object.entries(genre) .sort((a, b) => { if(b[1] === a[1]) return Number(a[0]) - Number(b[0]); else return b[1] - a[1]; }) .slice(0, 2) .forEach((music) => bestAlbum.push(Number(music[0]))); }) return bestAlbum; }
풀이
먼저 후보 곡들을 장르로 묶어주기 위해 genres 배열에 reduce 메서드를 사용해서
{ 장르명: { 고유 번호: 재생 횟수, count: 전체 재생 횟수 } } 와 같은 객체를 생성한다.그 후 장르별 재생 횟수가 높은 순으로 정렬하기 위해서 nominated 객체의 값들({ 고유 번호: 재생 횟수, count: 전체 재생 횟수 } )만 추출해서 sort 메서드를 이용해 전체 재생 횟수의 내림차순으로 정렬한다.
이제 위에서 정렬된 배열을 순회하면서 불필요한 count 키는 삭제하고,
각 장르 내부에서 [고유 번호, 재생 횟수] 를 재생 횟수 오름차순, 고유 번호 내림차순 순으로 다시 정렬한 뒤 두 번째 요소까지만 자르고,
각각의 고유 번호를 bestAlbum 배열에 넣어주면 된다.'Coding Test > Programmers Level 3' 카테고리의 다른 글
이중우선순위큐 (0) 2022.03.29