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

euneun·2022년 3월 19일
1

알고리즘

목록 보기
10/12

문제 풀이 방법

장르별로 가장 많이 재생된 노래를 두개씩 모아서 구성한다는 점에 집중해야한다.

  1. 그렇다면 우선 장르별로 총 재생횟수의 합을 저장해놓은 후, 재생 횟수별로 내림차순 정렬을 해놓는 과정이 필요하다.
    ex) [{pop:3100},{classic:1450}]과 같은 형태

  2. 고유번호, 장르, 재생횟수가 한데에 모아져있는 객체가 필요하다.
    ex)

[
  { genre: 'classic', index: 0, playCnt: 500 },
  { genre: 'pop', index: 1, playCnt: 600 },
  { genre: 'classic', index: 2, playCnt: 150 },
  { genre: 'classic', index: 3, playCnt: 800 },
  { genre: 'pop', index: 4, playCnt: 2500 }
]
  1. 2번 배열에서 1번 배열 객체의 키값에 해당하는 장르들을 배열에 따로 저장해서 재생횟수 별로 내림차순 정렬을 한 후, 상위 두개 원소의 고유번호만 뽑아서 answer 배열에 push 해준다.

전체 코드

주석 참고해서 이해하시면 좋을 것 같습니다 :)

function solution(genres, plays) {
    
    let answer = [];
  
    // 1번 과정
    let playCntByGenre={}
    for(let i=0;i<genres.length;i++){
        playCntByGenre[genres[i]]=playCntByGenre[genres[i]] ? playCntByGenre[genres[i]]+plays[i] : plays[i]
    }
    // 여기서 playCntByGenre는 {classic:1450,pop:3100} 형태
  
    // 재생횟수로 내림차순 정렬하기 위해, [키,밸류]의 배열 형태로 만들어준다
    let keyValueArr=Object.entries(playCntByGenre)
    keyValueArr.sort((a,b)=>b[1]-a[1]);
    // 정렬함수의 compareFunc 작성시, return 값이 양수면 앞뒤순서가 바뀐다는 점을 기억하면 쉽다!
  
    // 여기서 keyValueArr는 [ [ 'pop', 3100 ], [ 'classic', 1450 ] ] 형태
    
    // 2번 과정
    let allInfoObj=genres.map((g,i)=>({
        genre:g,
        index:i,
        playCnt:plays[i]
    })) 
    
    // 3번 과정
    keyValueArr.forEach((k,i)=>{
        let current=[];
        for(let j=0;j<allInfoObj.length;j++){
            if(k[0]===allInfoObj[j].genre){
                current.push(allInfoObj[j]);
            }
        }
        current.sort((a,b)=>b.playCnt-a.playCnt);
        current.forEach((c,i)=>{
            if(i<2){
             // 2개만 뽑아야 하기 때문에 index가 2보다 작을때까지만 answer.push 수행
            answer.push(c.index)
            }        
        })
    })
    
    return answer;
}

레벨3 치고는 쉬운 문제였던 것 같다 🤓

profile
제대로 짚고 넘어가자!🧐

0개의 댓글