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

2023. 3. 2. 15:38Algorithm

ㅇㄹㅇㄹ

재생횟수가 많은 장르 순으로 노래 두 개씩 모아서 베스트 앨범을 만든다.

1. 장르 별 재생횟수

2. 장르 별 재생이 많이 된 노래 두 개

3. 재생횟수가 많은 장르부터 노래 두 개씩 앨범에 싣기

* 노래가 한 개라면 하나만 싣기

 

코드 주석으로 설명!

function solution(genres, plays) {
    let answer=[] 
    let json = [] //genres, plays배열을 {genre:~, play:~, idx:~} 형태로 변형
    let hotMap = new Map() // 장르별로 재생횟수가 많은 순 idx 저장 
    let genreSum = [] // 장르 별 재생횟수 합 {genre:~, sum:~}
    let genreSet = new Set(genres) //장르의 종류
    
    // json형태로 변형, sort를 해도 idx값이 무엇인지 알기 위함
    for(let i =0; i<genres.length; i++){
        json.push({"genre":genres[i], "play":plays[i],"idx":i})
    }
    
    // 재생횟수 기준으로 내림차순 정렬, 추후 재생횟수가 많은 순으로 idx를 추가하기 위함
    json.sort((a, b) => {
    if (a.play < b.play) return 1;
    if (a.play > b.play) return -1;
    return 0;
});

	// 장르별 재생횟수 합, 많이 재생된 순으로 장르별 리스트에 추가 
    genreSet.forEach((val)=>{
        let sums =0
        let s = []
        json.filter(function(e){
            if(e.genre ===val){ 
                sums+= e.play //재생횟수 합
                hotMap.set(val, (hotMap.get(val)||s).concat([e.idx])) //장르별 리스트에 추가
            } 
        }) 
        genreSum.push({"genre":val, "sum":sums})
    })
    
    // 재생횟수 합 기준으로 내림차순 정렬
    genreSum.sort((a, b) => {
        if (a.sum < b.sum) return 1;
        if (a.sum > b.sum) return -1;
        return 0;
    });
    
    // 장르별 재생횟수 합 많은 순으로 노래 두 개씩 식디
    genreSum.forEach((val)=>{
   		// 장르 속 노래 리스트 가져오기
        let list = hotMap.get(val.genre)
        //장르 속 노래가 3개 이상이라면 2개까지 잘라쓰기, 아니라면 그냥 이어붙이기
        answer=answer.concat(list.length>2?list.slice(0,2):list) 
    })
    return answer
}

 

'Algorithm' 카테고리의 다른 글

스택과 큐  (0) 2023.03.02
[프로그래머스] 프린터  (0) 2023.03.02
[프로그래머스] 폰켓몬  (0) 2023.03.02
[프로그래머스] 완주하지 못한 선수  (1) 2023.03.02
해시란? Map과 Object의 차이  (0) 2023.03.01