[프로그래머스] 베스트앨범 - JavaScript

이은빈 EUNBIN·2021년 6월 29일
0
post-thumbnail

📌 문제



📌 풀이

1차 시도

function solution(genres, plays) {
    let answer = [];
    let map = new Map();
    
    // 장르별로 재생 수 누적
    for(let i = 0; i < genres.length; i++) {
        if(map.has(genres[i])) {
            map.set(genres[i], map.get(genres[i]) + plays[i]);
        } else {
            map.set(genres[i], plays[i]);
        }
    }
    
    let thisGenreSongs = [];
    
    while(map.size > 0) {
        let max = [...map.entries()].reduce((a, b) => a[1] > b[1] ? a: b)[0]; // 가장 많이 재생된 장르
    
      	// 가장 많이 재생된 장르와 같은 장르만 thisGenreSongs에 저장
        genres.filter((genre, index) => {
            if(genre === max) {
                thisGenreSongs.push(plays[index]);
            }
        });
        
        thisGenreSongs.sort((a, b) => b - a).splice(2); // 내림차순으로 정리하여 2개까지만 저장
      
        // 가장 많이 재생된 장르 중 가장 많이 재생된 곡을 answer에 저장(push) 후 해당 곡 제거(shift)
        while(thisGenreSongs.length > 0) {
            for(let i = 0; i < plays.length; i++) {
                if(plays[i] === thisGenreSongs[0]) {
                    answer.push(i);
                }
            }
            thisGenreSongs.shift();
        }
        map.delete(max); // 최대 재생 수 장르 제거
    }
    
    return answer;
}

/*
[테스트케이스 실행 결과] - 테스트케이스 2, 15번 실패
정확성: 86.7
합계: 86.7 / 100.0
*/

장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
3번 조건을 빼먹었다...💦


최종

function solution(genres, plays) {
    let answer = [];
    let map = new Map();
    
    // 장르별로 재생 수 누적
    for(let i = 0; i < genres.length; i++) {
        if(map.has(genres[i])) {
            map.set(genres[i], map.get(genres[i]) + plays[i]);
        } else {
            map.set(genres[i], plays[i]);
        }
    }

    let thisGenreSongs = [];

    while(map.size > 0) {
        let max = [...map.entries()].reduce((a, b) => a[1] > b[1] ? a: b)[0]; // 가장 많이 재생된 장르

        // 가장 많이 재생된 장르와 같은 장르만 thisGenreSongs에 저장
        genres.filter((genre, index) => {
            if(genre === max) {
                thisGenreSongs.push(plays[index]);
            }
        });

        thisGenreSongs.sort((a, b) => b - a).splice(2);  // 내림차순으로 정리하여 2개까지만 저장
        
        // 가장 많이 재생된 장르 곡들의 재생 수가 같다면
        if(thisGenreSongs[0] === thisGenreSongs[1]) {
            plays.map((play, index) => {
                if(thisGenreSongs[0] === play) {
                    answer.push(index);
                }
            })
            thisGenreSongs = [];
        } else { // 가장 많이 재생된 장르 곡들의 재생 수가 다르다면
            // 가장 많이 재생된 장르 중 가장 많이 재생된 곡의 고유번호를 answer에 저장(push) 후 해당 곡 제거(shift)
            while(thisGenreSongs.length > 0) {
                for(let i = 0; i < plays.length; i++) {
                    if(plays[i] === thisGenreSongs[0]) {
                        answer.push(i);
                    }
                }
                thisGenreSongs.shift();
            }
        }
        map.delete(max); // 가장 많이 재생된 장르 제거
    }
    
    return answer;
}

// 다른 분의 풀이
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);    
}
profile
Frontend Engineer & Value Creator

0개의 댓글