개발 공부

(프로그래머스)(자바스크립트) 베스트앨범 본문

알고리즘

(프로그래머스)(자바스크립트) 베스트앨범

아이셩짱셩 2021. 7. 7. 16:36

코딩테스트 연습 - 해시 - 베스트엘범

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

 

첫시도. (틀린 답안)

sorting까지 완료. 하지만 효율적으로 장르별 2개씩만 가져오는 게 생각이 안나 갈아 엎었다.

function solution(genres, plays) {
    var answer = [];
    
    var musicMapArray = [];
    var totalObj = {};
    
    for(var i = 0 ; i < genres.length ; i ++){
        var musicObj = {};
        musicObj['number'] = i;
        musicObj['genre'] = genres[i];
        musicObj['count'] = plays[i];
        
        totalObj[genres[i]] = totalObj[genres[i]] ? totalObj[genres[i]] + plays[i] : plays[i];
        musicMapArray.push(musicObj);
    }
    console.log(musicMapArray, totalObj)
    
    musicMapArray.sort(function (a, b) {
        if (totalObj[a.genre] > totalObj[b.genre]) {
            return -1;
        }
        if (totalObj[a]  < totalObj[b] ) {
            return 1;
        }
        // a must be equal to b
        if(a.genre == b.genre){
            if (a.count > b.count) {
                return -1;
            }
            if (a.count  < b.count ) {
                return 1;
            }
            return 0;
        }
        return 0;

    });

    //console.log(musicMapArray, totalObj)
    return answer;
}

 

두번째 시도. (틀린 답안)

런타임 에러 났다.

function solution(genres, plays) {
    var answer = [];
    
    var totalObj = {};
    var musicObjObj = {};
    
    for(var i = 0 ; i < genres.length ; i ++){
        var musicObj = {};
        musicObj['number'] = i;
        musicObj['count'] = plays[i];
        musicObjObj[genres[i]] ? musicObjObj[genres[i]].push(musicObj) : musicObjObj[genres[i]] = [musicObj]; 
        
        totalObj[genres[i]] = totalObj[genres[i]] ? totalObj[genres[i]] + plays[i] : plays[i];
        //musicMapArray.push(musicObj);
    }
    //console.log(musicObjObj, totalObj)
    
    Object.keys(musicObjObj).forEach(key => {
        musicObjObj[key].sort(function (a, b) {

            if (a.count > b.count) {
                return -1;
            }
            if (a.count  < b.count ) {
                return 1;
            }
            return 0;
        });
    });
    
    var totalObjArray = Object.entries(totalObj);
    totalObjArray.sort(function (a, b) {

            if (a[1] > b[1]) {
                return -1;
            }
            if (a[1]  < b[1]) {
                return 1;
            }
            return 0;
        });
    
    //console.log(musicObjObj)
    //console.log(totalObjArray)
    
    for(var i = 0 ; i < totalObjArray.length ; i++){
        for(var j = 0 ; j < 2 ; j++){
            //console.log(totalObjArray[i][0])
            answer.push(musicObjObj[totalObjArray[i][0]][j].number)
        }
    }
    return answer;
}

 

세번째 시도. (정답)

이전 답안과 큰 차이가 없다. 

런타임 에러는 array index 문제일 확률이 높아 빼먹은 조건이 없는지 리뷰했고

장르별 음악이 1개만 있을 수도 있음을 확인해 해당 처리를 하니 잘 됐다.

//1~2시간 소요
function solution(genres, plays) {
    var answer = [];
    
    var totalObj = {};
    var musicObjObj = {};
    
    for(var i = 0 ; i < genres.length ; i ++){
        var musicObj = {};
        musicObj['number'] = i;
        musicObj['count'] = plays[i];
        musicObjObj[genres[i]] ? musicObjObj[genres[i]].push(musicObj) : musicObjObj[genres[i]] = [musicObj]; 
        
        totalObj[genres[i]] = totalObj[genres[i]] ? totalObj[genres[i]] + plays[i] : plays[i];
        //musicMapArray.push(musicObj);
    }
    console.log(musicObjObj, totalObj)
    
    Object.keys(musicObjObj).forEach(key => {
        musicObjObj[key].sort(function (a, b) {

            if (a.count > b.count) {
                return -1;
            }
            if (a.count  < b.count ) {
                return 1;
            }
            return 0;
        });
    });
    
    var totalObjArray = Object.entries(totalObj);
    totalObjArray.sort(function (a, b) {

            if (a[1] > b[1]) {
                return -1;
            }
            if (a[1]  < b[1]) {
                return 1;
            }
            return 0;
        });
    
    console.log(musicObjObj)
    console.log(totalObjArray)
    
    for(var i = 0 ; i < totalObjArray.length ; i++){
        for(var j = 0 ; j < 2 ; j++){
            //console.log(totalObjArray[i][0])
            if(totalObjArray[i][0] && musicObjObj[totalObjArray[i][0]][j]){ //이처리를 안 해줘서 runtime error났는데 장르에 속한 곡이 하나인 경우 조건을 보고 2loop를 돌린 때를 체크
                answer.push(musicObjObj[totalObjArray[i][0]][j].number)    
            }
            
        }
    }
    return answer;
}

 

 

Comments