Bin's Blog

[프로그래머스] Level3 - 베스트앨범(Javascript) 본문

Algorithm

[프로그래머스] Level3 - 베스트앨범(Javascript)

hotIce 2023. 9. 14. 22:15
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝문제 요약

 

1️⃣ 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려고 한다. 노래는 고유 번호로 구분한다.

2️⃣ 속한 노래가 많이 재생된 장르를 먼저 수록한다.

3️⃣ 장르 내에서 많이 재생된 노래를 먼저 수록한다.

4️⃣ 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록한다.

5️⃣ 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성해라.

 

✅ 정답 코드

function solution(genres, plays) {
    let answer = [];
    let genresMap = new Map();
    let playsMap = new Map();

    for (let i = 0; i < genres.length; i++) {
        // 만약에 장르가 이미 Map에 존재한다면
        if (genresMap.has(genres[i])) {
            // 장르의 재생 횟수를 누적시킨다.
            genresMap.set(genres[i], genresMap.get(genres[i]) + plays[i]);
            // 그리고 고유 번호와 재생 횟수를 해당 장르에 넣기 위해 장르에 해당하는 배열을 가져오고 
            const currentList = playsMap.get(genres[i]);
            // 구분하기 위해서 배열에 고유번호, 재생 횟수를 객체에 감싸서 넣어 놓는다.
            currentList.push({index: i, play: plays[i]});
            // 그리고 새로 수정한 값을 다시 Map 객체에 넣어준다.
            playsMap.set(genres[i], currentList);
        } else {
            // 만약에 장르가 존재하지 않으면 그냥 넣어준다.
            genresMap.set(genres[i], plays[i]);
            playsMap.set(genres[i], [{index: i, play: plays[i]}]);
        }
    }

    // 쉽게 정렬하기 위해 Map => array
    let sortedGenres = [...genresMap];
    // 누적 횟수를 기준으로 정렬한다.
    sortedGenres.sort((a, b) => b[1] - a[1]);
    
    // 해당 장르 정렬 
    for (let [genre] of sortedGenres) {
        playsMap.get(genre).sort((a, b) => {
            // 재생횟수가 비슷하면 고유 번호를 기준으로 오름차순 정렬을 한다.
            if (b.play === a.play) return a.index - b.index;
            // 아니면 재생횟수 높은 순으로 정렬한다. 
            return b.play - a.play;
        });
    }

    
    for (let [genre] of sortedGenres) {
        // 최대 2곡까지 가능하니 구조분해할당 후에 => 해당 장르에 2곡씩 뽑아서 고유 번호를 배열에 담아준다.
        answer.push(...playsMap.get(genre).slice(0, 2).map(item => item.index));
    }

    return answer;
}

 

📚 중요 포인트

1️⃣ Map객체를 활용해서 장르가 이미 객체에 있을 때, 없을 때 구분해서 새로운 값을 넣기

2️⃣ 장르를 정렬하고 재생 횟수가 같을 때 고유 번호로 정렬하기 위해서 객체의 key 값을 index로 하고 index를 기준으로 정렬했다.

3️⃣ 최대 2곡씩 뽑아야하니 slice를 활용해서 해당 고유 번호를 넣어줬다. 

 

📔느낀점

👉 평소에 Map 객체을 사용하지 않고 그냥 객체만 활용을 했었는데 이번 기회에 Map 객체를 활용하고 공부할 수 있어서 좋았다. 

👉 정렬 문제는 특히 나중에 쉽게 정렬하기 위해서 배열이나 객체에 값을 담을 때 식별자를 넣으면 편한 것 같다. 

728x90