프린세스 다이어리

[프로그래머스] 자바스크립트 베스트 앨범 문제 해설 본문

자료구조, 알고리즘

[프로그래머스] 자바스크립트 베스트 앨범 문제 해설

개발공주 2021. 11. 17. 12:49
728x90

> 문제 바로가기

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

크으 쾌감!

1. 접근 방법

 

(0) 일단 문제가 해시 카테고리에 있다는 점을 참고해 map을 생성하여 작성함.

 

(1) map에 장르별로 key에 장르를, value에 각 곡의 인덱스와 실행 횟수를 배열로 넣어주고, 문제의 조건대로 value 정렬하기

    let map = new Map();
    for (let i = 0; i < genres.length; i++) {
        if (map.get(genres[i])) {
            map.set(genres[i], [...map.get(genres[i]), {idx: i, count: plays[i]}]);
        } else {
            map.set(genres[i], [{idx: i, count: plays[i]}])
        }
        
        const temp = map.get(genres[i])
        temp.sort((a,b) => b.count - a.count);
        temp.sort((a,b) => {
            if (a.count === b.count) {
                a.idx - b.idx
            }
        });
        map.set(genres[i], temp);
    }

 

(2) array 하나를 생성해 장르별로 장르 이름과 실행횟수실행 횟수 합계를 object로 저장함. 그리고 실행 횟수 내림차순으로 정렬함.

    let array = [];
    for (let genre of map.keys()) {
        const temp = map.get(genre); // []
        const total = temp.reduce((acc, cur) => acc + cur.count, 0);
        array.push({
            genre: genre,
            total: total,
        })
    }
    array.sort((a, b) => b.total - a.total);

 

(3) 정답을 담을 answer 배열 하나를 생성해, 위에서 최다 실행 횟수 순으로 정렬한 array를 돌면서 곡 최대 2개씩 빼내어 answer에 담음

    let answer = [];
    for (let i = 0; i < array.length; i++) {
        const topSongs = map.get(array[i].genre); // [{}, {}, {}, ...] 
        const sliced = topSongs.slice(0, 2); // [{}, {}]
        if (sliced.length >= 2) {
            answer = [...answer, sliced[0].idx, sliced[1].idx]; // sliced가 원소가 1이하인 경우엔???
        } else {
            answer = [...answer, sliced[0].idx]
        }
        
    }

 

2. 전체 해답

function solution(genres, plays) {
    // 1. map에 장르별로 하나씩 넣어주고 각각 value 정렬하기
    let map = new Map();
    for (let i = 0; i < genres.length; i++) {
        if (map.get(genres[i])) {
            map.set(genres[i], [...map.get(genres[i]), {idx: i, count: plays[i]}]);
        } else {
            map.set(genres[i], [{idx: i, count: plays[i]}])
        }
        
        const temp = map.get(genres[i])
        temp.sort((a,b) => b.count - a.count);
        temp.sort((a,b) => {
            if (a.count === b.count) {
                a.idx - b.idx
            }
        });
        map.set(genres[i], temp);
    }
    
    // array에 장르별로 합계를 object로 넣기
    let array = [];
    for (let genre of map.keys()) {
        const temp = map.get(genre); // []
        const total = temp.reduce((acc, cur) => acc + cur.count, 0);
        array.push({
            genre: genre,
            total: total,
        })
    }
    array.sort((a, b) => b.total - a.total);
    
    // array에서 장르 하나씩 꺼내면서 2개 
    let answer = [];
    for (let i = 0; i < array.length; i++) {
        const topSongs = map.get(array[i].genre); // [{}, {}, {}, ...] 
        const sliced = topSongs.slice(0, 2); // [{}, {}]
        if (sliced.length >= 2) {
            answer = [...answer, sliced[0].idx, sliced[1].idx]; // sliced가 원소가 1이하인 경우엔???
        } else {
            answer = [...answer, sliced[0].idx]
        }
        
    }
    
    return answer;
}

 

728x90
Comments