[프로그래머스] 베스트 앨범(javascript)

프린이·2021년 6월 3일
1

  • 제 코드는 최선의 방안은 아닙니다.
  • 단순히 기록용, 공유용이니 이 점 보실 때, 참고바랍니다!

🔗 문제 링크

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

📙 풀이 과정

1. 객체로 장르별 재생 수를 정리함

2. 장르별 재생 수를 다 더해 가장 많이 플레이 된 장르 순으로 정렬

3. 장르별 재생 수를 내림차순으로 정렬

4. 가장 많이 플레이 된 장르부터 재생 수 높은 두 개를 뽑아 배열에 저장

5. 배열에 있는 재생 수 들의 원래 배열에서의 위치를 가져와 다시 배열에 저장해 반환함

📝 답안 코드

function solution(genres, plays) {
    var answer = [];
    var arr = [];
    var obj;

    //객체로 장르와 재생수 정리
    for(var i = 0; i < genres.length; i++){
        if(arr.findIndex(a => a.genres == genres[i])  == -1){
            obj = { genres : genres[i], plays : [plays[i]]};
            arr.push(obj);
        }else{
            var index = arr.findIndex(a => a.genres == genres[i]);
            arr[index].plays.push(plays[i]);
        }
    }

    //가장 많이 플레이 된 장르 순으로 정렬
    var arr2 = [];
    arr.filter(function(i){
        var sum = 0;
        i.plays.filter(function(a){
            sum += a;
        });
        arr2.push(sum);
   });
    // 배열 정렬하기 전에 원래 배열 따로 변수에 저장
    var arrTmp = arr2.slice(); 
    arr2 = sortF(arr2);

    //장르별 많이 재생된 횟수의 인덱스를 배열에 저장
    for(var i = 0; i < arrTmp.length; i++){
        var array = arr[arrTmp.indexOf(arr2[i])].plays;
        var tmp = sortF(array).slice(0,2);

        for(var j = 0; j < tmp.length; j++){
            if(answer.indexOf(plays.indexOf(tmp[j])) != -1){
                var element = tmp[j];
                var idx = plays.indexOf(element);
                var indices = [];
                while (idx != -1) {
                  indices.push(idx);
                  idx = plays.indexOf(element, idx + 1);
                }
                answer = answer.concat(indices.slice(1,indices.length));
            }
            else{
                answer.push(plays.indexOf(tmp[j]));
            }
        }
    }
    return answer;

    //내림차순정렬함수
    function sortF(arrM){
        arrM.sort(function(a, b){
          return b-a;
        });
        return arrM;
    }
}

🟡 느낀 점

  • 해시, 객체 모두 자주 안써봐서 공부하며 풀어야해서 굉장히 시간이 오래 걸렸다.
  • 앞으로는 연습을 자주해야겠다. 이번 코드도 공부하면 더 정돈되게 짤 수 있을 것 같은데 아직 많이 부족해 저 코드가 최선이었다ㅜㅜ
profile
주니어 프론트엔드개발자

0개의 댓글