ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JavaScript] 베스트앨범 (Feat. 첫 Lv3)
    IT Study/프로그래머스 2023. 11. 6. 14:49
    728x90

     

    초기 코드

    function solution(genres, plays) {
    	// 베스트 앨범에 들어갈 노래의 고유 번호를 저장하는 Array
        let answer = [];
        
        // 장르 별 총 재생 수를 나타내는 Map
        let genreTotalPlayMap = new Map();
        
        for (let i = 0; i < genres.length; i++) {
            const genre = genres[i];
            const play = plays[i];
            
            if (genreTotalPlayMap.has(genre)) {
                genreTotalPlayMap.set(genre, genreTotalPlayMap.get(genre) + play);
            } else {
                genreTotalPlayMap.set(genre, play);
            }
        }
        
        // 장르별 재생 수 높은 순으로 나타내기 위한 Array
        let genreTotalPlayArray = Array.from(genreTotalPlayMap);
    
        genreTotalPlayArray.sort((a, b) => {
            if (a[1] > b[1]) {
                return -1;
            }
            if (a[1] < b[1]) {
                return 1;
            }
            return 0;
        });
        
        // 장르별 재생 수를 나타내는 Map
        let genrePlayMap = new Map();
        
        for (let i = 0; i < genres.length; i++) {
            const genre = genres[i];
            const play = plays[i];
            
            if (genrePlayMap.has(genre)) {
                const playData = genrePlayMap.get(genre);
                playData.push({play: play, index: i});
                playData.sort((a, b) => {
                    if (a.play > b.play) {
                        return -1;
                    }
                    if (a.play < b.play) {
                        return 1;
                    }
                    return;
                })
                genrePlayMap.set(genre, playData);
            } else {
                genrePlayMap.set(genre, [{play: play, index: i}]);
            }
        }
        
        // 상위 2개 노래를 나타내어 담기
        for (let genre of genreTotalPlayArray) {
            const data = genrePlayMap.get(genre[0]);
            answer.push(data[0].index, data[1].index);
        }
        
        return answer;
    }

     

    코드가 많이 길죠...

    (1) 장르별 총 재생 수를 계산하는 genreTotalPlayMap를 생성하였습니다.
    (2) 위 Map을 배열로 변환하고 내림차순으로 정렬하여 genreTotalPlayArray를 생성하였습니다.  
    (3) 각 장르별로 각 노래의 재생 수와 인덱스를 저장하는 genrePlayMap를 생성하였습니다.
    (4) 각 장르별 노래 정보를 재생 수가 높은 순으로 정렬하였습니다.
    (5) 최종적으로 장르별로 가장 많이 재생된 두 곡의 인덱스를 answer 배열에 추가하였습니다.

     

    그러나 몇 가지 개선할 점이 있습니다.

    (1) 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록해야 하는데, 이 부분을 반영하지 않았습니다.
    (2) 장르에 속한 곡이 하나라면, 하나의 곡만 선택해야 하는데, 이 부분을 반영하지 않았습니다.

     

    최종 코드

    function solution(genres, plays) {
        // 베스트 앨범에 들어갈 노래의 고유 번호를 저장하는 Array
        let answer = [];
        
        // 장르 별 총 재생 수를 나타내는 Map
        let genreTotalPlayMap = new Map();
        
        // 장르별 재생 수를 나타내는 Map
        let genrePlayMap = new Map();
        
        for (let i = 0; i < genres.length; i++) {
            const genre = genres[i];
            const play = plays[i];
            
            // 장르별 총 재생 수를 계산하여 genreTotalPlayMap에 저장
            genreTotalPlayMap.set(genre, (genreTotalPlayMap.get(genre) || 0) + play);
            
            // 장르별 각 노래의 재생 수와 인덱스를 저장하여 genrePlayMap에 저장
            if (genrePlayMap.has(genre)) {
                genrePlayMap.get(genre).push({play: play, index: i});
            } else {
                genrePlayMap.set(genre, [{play: play, index: i}]);
            }
        }
        
        // 장르별 재생 수 높은 순으로 나타내는 Array
        let genreTotalPlayArray = Array.from(genreTotalPlayMap).sort((a, b) => b[1] - a[1]);
        
        for(let genre of genreTotalPlayArray) {
            let genrePlayArray = genrePlayMap.get(genre[0]);
            
            // 장르 내에서 노래를 재생 수가 높은 순으로, 재생 수가 같은 경우에는 인덱스가 낮은 순으로 정렬
            genrePlayArray.sort((a, b) => b.play - a.play || a.index - b.index);
            
            // 가장 많이 재생된 노래의 인덱스를 answer에 추가
            answer.push(genrePlayArray[0].index);
            
            // 두 번째로 많이 재생된 노래가 있다면 그 노래의 인덱스를 answer에 추가
            if(genrePlayArray[1]) {
                answer.push(genrePlayArray[1].index);
            }
        }
        
        return answer;
    }

     

    Lv3를 처음 풀어낸 것이라 좋지만, 조금 더 실력을 올려야겠습니다... :)

Designed by Tistory.