본문 바로가기

IT/JavaScript

프로그래머스 자바스크립트 코딩테스트 베스트앨범 문제 해설

728x90
반응형
728x170

안녕하세요! 오늘은 프로그래머스 플랫폼(https://school.programmers.co.kr/) 에서 자바스크립트(JavaScript)를 활용하여 코딩테스트를 해보고 해설을 해보는 시간을 가지고자 합니다.

 

이번에 진행할 코딩테스트는 아래와 같습니다.

 

[프로그래머스 자바스크립트 코딩테스트 베스트앨범 내용]

프로그래머스 자바스크립트 코딩테스트 베스트앨범 문제

 

 

[프로그래머스 자바스크립트 코딩테스트 베스트앨범 해설]

 

function solution(genres, plays) {
    const songsByGenre = {};
    const totalPlaysByGenre = {};
    const n = genres.length;

    // 장르별 노래 목록과 재생횟수 합계 계산
    for (let i = 0; i < n; i++) {
        const genre = genres[i];
        const playsForSong = plays[i];
        if (!songsByGenre[genre]) {
            songsByGenre[genre] = [];
            totalPlaysByGenre[genre] = 0;
        }
        songsByGenre[genre].push({ id: i, plays: playsForSong });
        totalPlaysByGenre[genre] += playsForSong;
    }

    // 재생횟수 합계가 높은 장르순으로 정렬
    const sortedGenres = Object.keys(totalPlaysByGenre).sort((a, b) => {
        return totalPlaysByGenre[b] - totalPlaysByGenre[a];
    });

    const answer = [];
    // 재생횟수 합계가 높은 장르부터, 각 장르별로 노래 두 개씩 선택
    sortedGenres.forEach((genre) => {
        const songs = songsByGenre[genre];
        // 노래가 하나밖에 없는 경우
        if (songs.length === 1) {
            answer.push(songs[0].id);
        } else {
            // 노래가 두 개 이상인 경우, 재생횟수가 많은 순으로 정렬하고 먼저 두 개 선택
            songs.sort((a, b) => {
                return b.plays - a.plays;
            });
            answer.push(songs[0].id);
            answer.push(songs[1].id);
        }
    });

    return answer;
}

 

스트리밍 사이트에서 베스트 앨범을 출시하기 위해서는, 장르별로 가장 많이 재생된 노래를 두 개씩 골라야 합니다. 이 때 고유번호가 작은 노래를 먼저 수록해야 합니다. 이를 위해 우선 각 장르별 재생횟수를 더하고, 이를 내림차순으로 정렬합니다. 그 후, 각 장르별로 재생횟수가 많은 노래를 먼저 두 개씩 고르고, 이를 고유번호순으로 정렬합니다.

 

주어진 조건에 따라 베스트 앨범에 수록될 노래의 고유 번호를 찾아내야 합니다. 이를 위해 노래의 재생 횟수와 장르 정보를 바탕으로 각 장르의 노래들을 재생 횟수에 따라 내림차순으로 정렬하고, 재생 횟수가 같은 경우 고유 번호를 오름차순으로 정렬합니다. 그리고 각 장르당 두 개씩의 노래를 선택하여 베스트 앨범에 추가합니다. 우선 genres와 plays 배열을 묶어서 genrePlayList라는 객체 배열을 만듭니다. 이 객체 배열은 각 노래의 재생 횟수와 장르 정보를 저장합니다. 그리고 genreCount라는 객체를 만들어 각 장르가 몇 번 재생되었는지 카운트합니다. 이후에 genreCount 객체를 내림차순으로 정렬하여 가장 많이 재생된 장르부터 처리하며, 각 장르당 노래 리스트를 내림차순으로 정렬합니다. 그리고 각 장르당 최대 두 개의 노래를 선택하여 answer 배열에 추가합니다. 이때, 노래 리스트가 하나인 경우에는 해당 노래를 선택합니다. 마지막으로 answer 배열을 반환합니다.

728x90
반응형
그리드형