코딩테스트/Programmers

베스트 앨범 (JS)

동띵 2025. 1. 6. 21:41

https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

// 장르별로 가장 많이 재생된 노래 2개씩
// 가장 많이 재생된 장르 -> 장르 내에서 많이 재생된 노래 -> 재생 수 같으면 고유번호 오름차순

function solution(genres, plays) {
    const answer = [];
    const total = {}; // 각 장르별 총 재생 횟수를 저장할 객체
    const summary = {}; // 각 장르별로 노래 정보를 저장할 객체
    
    // 주어진 장르와 재생 횟수를 기반으로 데이터를 정리
    genres.forEach((genre, idx) => {
        // 장르별 총 재생 횟수를 누적
        total[genre] = (total[genre] || 0) + plays[idx];
        
        // 해당 장르에 속한 노래 정보 저장 (노래 id와 재생 횟수)
        if (!summary[genre]) {
            summary[genre] = []; // 해당 장르가 처음 등장하면 빈 배열로 초기화
        } 
        summary[genre].push([idx, plays[idx]]); // 노래 정보 추가
    });

    // 장르를 총 재생 횟수 기준으로 내림차순 정렬
    const sortedGenres = Object.keys(total).sort((a, b) => total[b] - total[a]);

    // 정렬된 장르를 순회하며 각 장르에서 최대 2곡을 선택
    for (const genre of sortedGenres) {
        // 해당 장르의 노래들을 재생 횟수 기준으로 내림차순 정렬
        // 만약 재생 횟수가 같다면 노래 id를 기준으로 오름차순 정렬
        const sortedSongs = summary[genre].sort((a, b) => 
            a[1] === b[1] ? a[0] - b[0] : b[1] - a[1]
        );
        
        // 정렬된 노래 중 상위 2곡의 id 값을 결과 배열에 추가
        answer.push(...sortedSongs.slice(0, 2).map((song) => song[0]));
    }
    
    return answer; // 베스트 앨범에 수록할 노래들의 id 배열 반환
}

'코딩테스트 > Programmers' 카테고리의 다른 글

신고 결과 받기 (JS)  (1) 2025.01.07
오픈 채팅방 (JS)  (1) 2025.01.06
표 편집 (JS)  (1) 2025.01.05
크레인 인형 뽑기 (JS)  (0) 2025.01.05
방문 길이 (JS)  (1) 2025.01.05