본문 바로가기
Study Note/Algorithm

프로그래머스 #해시 - 베스트앨범 lv3

by 시뮝 2021. 1. 16.
728x90

코딩테스트 연습 문제 한바퀴 돌고 돌아오면 리펙토링이 시급하다 ㅠ.ㅠ

결과가 맞더라도 더 나은 코드를 위해 연구를!

 

function solution(genres, plays) {
    let answer = [];
    const len = genres.length; //노래갯수
    const genresList = (function () { //고유번호 순서대로 한 리스트에 담기
        const result = [];
        for(let i=0; i<len; i++){
            result.push([
                genres[i], { no: i, play: plays[i] }
            ]);
        }
        return result;
    });

    /* 기준 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. */
    
    // 기준 1-1. 장르별 재생횟수 합 구하기
    //list로 구현해도 되나 Map에 익숙해지기 위해 의식적으로 사용 중입니다 ㅎㅎ
    const genSumMap = new Map(); 
    
    for(let i=0; i<len; i++) {
        let nm = genres[i];
        let play = plays[i];
        let playSum = play;
        
        if(genSumMap.has(nm)) 
            playSum = genSumMap.get(nm).playSum+play;

        genSumMap.set(nm, {'playSum': playSum});
    }

    // 기준 1-2. 정렬
    let genSumMapKeys = [];
    let iterObj = genSumMap.entries();
    
    if(0<genSumMap.size) {
        while (true) {
            let iter = iterObj.next();
            if(iter.done) {
                break;
            }
            genSumMapKeys.push(iter.value);
        } 
    }
    
    genSumMapKeys.sort(function (a, b) {
        let aps = a[1].playSum;
        let bps = b[1].playSum;
        return bps - aps; //재생횟수 sum 내림차순
    });
    
    
    for(let i=0; i<genSumMapKeys.length; i++){
        let tempList = genresList().filter(gen=>gen[0]==genSumMapKeys[i][0]);
        let tempLen = 2>tempList.length ? tempList.length : 2;

        tempList.sort(function (a, b) {
            let ap = a[1].play
            let bp = b[1].play;

            if(ap!=bp) {
                return bp - ap; //다른 값이면 재생횟수 내림차순
            } else {
                return a[1].no - b[1].no; //조건3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 오름차순
            }        
        });
        
        for(let i=0; i<tempLen; i++){
            answer.push(tempList[i][1].no);
        }
    }

    return answer;
}

728x90

댓글