[프로그래머스] 베스트 엘범

adultlee·2023년 6월 8일
0

문제 링크

프로그래머스 문제

풀이

여러가지 genres의 종류가 들어올 수 있으며, 이 때, O(1) 이라는 적은 시간복잡도로 찾기 위해서는 hash를 사용하면 손쉽게 해결이 가능하다.

hash map을 구성할때, 들어가야할 정보들은 다음과 같다.

const map = {
        //genreName,
        //plays
        //array {
        // index,
        // plays
        //}
    }

다음과 같이 들어가게 되며, 정렬을 두번에 걸쳐서 진행한다.
처음에는 map에 대한 정렬, plays 를 기준으로 정렬을 진행한다.
그 다음에는 정렬된 genres 내부에서, plays 와 index 를 기준으로 정렬하며,
그 이후에는 정렬된 값들중 최대 2개까지만 answer에 추가할 수 있도록 제한한다.

코드

function solution(genres, plays) {
    var answer = [];
    
    const map = {
        //genreName,
        //plays
        //array {
        // index,
        // plays
        //}
    }
    
    for(let i=0; i< genres.length; i++){
        if(map[genres[i]]){// 장르를 가지고 있다면,
            map[genres[i]].plays+= plays[i]
            map[genres[i]].array.push({
                index : i,
                plays : plays[i]
            })
        }else{ // 장르를 가지고 있지 않다면,
            map[genres[i]] = {
                genreName : genres[i],
                plays : plays[i],
                array : [{
                    index : i,
                    plays : plays[i]
                }]
            }
        }
    }
    const genresArray = []
    for(let val in map){
        genresArray.push(map[val])
    }
    //정렬을 진행합니다.
    genresArray.sort((a,b) => {
        if(a.plays> b.plays){
            return -1
        }else{
            return 1
        }
    })
    
    for(let i=0; i< genresArray.length; i++){
        const curArray = genresArray[i].array;
        
        curArray.sort((a,b) => {
            if(a.plays > b.plays){
                return -1
            }else if(a.plays < b.plays){
                return 1
            }else{
                if(a.index < b.index){
                    return -1
                }else{
                    return 1
                }
            }
        })
        for(let i =0; i < curArray.length; i++){
            if(i === 2){ // 여기서 2개 이상이 출력되지 않도록 막는다.
                break;
            }else{
                answer.push(curArray[i].index)
            }
        }
        
    }
    
    
    
    return answer;
}

0개의 댓글