본문 바로가기

코딩테스트

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

반응형

문제

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

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

나의 풀이

function solution(genres, plays) {
    var answer = [];
    let obj = {};
    let obj2 = {};

    //obj에 장르의 총 재생횟수, obj2에 장르별 모든 [고유번호,재생횟수]를 넣어주었다.
    for(let i = 0 ; i < genres.length;i++){
        if (obj[genres[i]]){
            obj[genres[i]] += plays[i]
        } else{
            obj[genres[i]] = plays[i]
        }

        if(obj2[genres[i]]){
            obj2[genres[i]].push([i,plays[i]])
        } else{
            obj2[genres[i]] = [[i,plays[i]]]
        }
    }

    //sort를 사용하기 위해 obj를 배열로 변환
    let totalscore = []
    let bestmusic = []
    for (let genre in obj){
        totalscore.push([genre,obj[genre]])
    }
    for (let genre in obj2){
        bestmusic.push([genre,obj2[genre]])
    }
    totalscore.sort((a,b)=>b[1] - a[1])

    // 장르의 갯수 만큼 best music 2개(혹은 1개)의 고유번호를 answer에 넣어준다.
    for(let i = 0 ; i< totalscore.length;i++){
        let target = totalscore[i][0]

        let values = bestmusic.filter(el=>el[0] == target).pop()[1]
        values.sort((a,b)=> b[1]- a[1])

        if ( values.length === 1){
            answer.push(values[0][0])
        }

        if ( values.length >1){
            answer.push(values[0][0])
            answer.push(values[1][0])
        }
    }

    return answer;
}

다른이의 풀이

블로그

 

[Programmers] 해시: Level 3 - 베스트앨범 (javascript) 문제 풀이

문제 원본 사이트 : programmers.co.kr/learn/courses/30/lessons/42579?language=javascript# 코딩테스트 연습 - 베스트앨범 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범..

miiingo.tistory.com

나도 객체로 데이터를 받고, 다시 배열로 만들어서 정리했는데,
배열 내에 객체 형태로 push 한 후 이를 활용하는게 더 좋아보인다.
요런 식으로 == > [{no:1, genre : 'classic' , play : 500}]
이러면 sort도 바로 쓸수 있고, for문으로 돌리면서 정보 접근도 편해보인다.( 나중에 다시 풀때는 이렇게 풀어보자)

참고

객체 정렬 = > 객체를 배열로 만든 후 정렬  // 참고

 

for in 은 객체 순환
for of 는 배열 순환

// 참고

반응형