[프로그래머스] 베스트앨범
2023. 3. 2. 15:38ㆍAlgorithm
ㅇㄹㅇㄹ
재생횟수가 많은 장르 순으로 노래 두 개씩 모아서 베스트 앨범을 만든다.
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 |