코딩테스트/프로그래머스

프로그래머스 베스트앨범

의현 2025. 6. 4. 19:48

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=javascript

문제 풀이

같은 장르별로 묶기 위해 genres_dict을 사용, 또한 각 앨범 별 우선순위(1번 조건)을 파악하기 위해 총 갯수를 세는 count_dict 사용

1. count_dict을 dict형태를 array형태로 변환(Object.entries 메서드)을 해서 value값([, v1])을 기준으로 내림차순으로 sort진행 -> 정렬된 값중 key값을 리턴해서 count_dict에 저장

2. count_dict은 갯수로 내림차순 정렬이 되어있는 key값(genre문자열)이 저장되어있으므로 해당 key를 genres_dict에서 찾아 최대 2개 까지 출력하도록 구현

3. 각 장르별로 value(2번 조건)로 내림차순, id(3번 조건)로 오름차순으로 정렬하여 최대 2개 까지 answer에 저장

function solution(genres, plays) {
    var answer = [];
    let genres_dict = {};
    let count_dict = {};
    
    for (let i = 0; i < genres.length; i++) {
        if (genres_dict[genres[i]]) {
            genres_dict[genres[i]].push([i, plays[i]]);
        } else {
            genres_dict[genres[i]] = [[i, plays[i]]];
        }
        
        if (count_dict[genres[i]]) {
            count_dict[genres[i]] += plays[i];
        } else {
            count_dict[genres[i]] = plays[i];
        }
    }
    
    // count_dict 정렬
    count_dict = Object.entries(count_dict).sort(([, v1], [, v2]) => v2 - v1).map(r => r[0]);
    
    // genres_dict 정렬
    for (const genre of count_dict) {
        let target = genres_dict[genre];
        // value(내림차순) -> id(오름차순) 순으로 정렬
        target.sort(([k1, v1], [k2, v2]) => {
            if (v1 !== v2) return v2 - v1;
            return k1 - k2;
        });
        
        for (let i = 0 ; i < target.length; i++) {
            if (i > 1) break;
            answer.push(target[i][0]);
        }
    }
    
    
    return answer;
}

결론

문제의 핵심은 dict형태로 같은 장르별로 묶고 해당 값을 sort하는 법을 알아야 함

-> dict을 array로 변환시켜 sort 메서드를 이용

+ 다시 객체형태({})로 만들기 위해서는 Object.fromEntries()를 써야 함 -> array를 object로 만들어줌 (위 문제에서는 다시 변환할 필요가 없어서 이 부분은 제외)