카테고리 없음
프로그래머스 - 베스트 앨범
gurwhddl
2023. 4. 26. 16:09
문제
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.
풀이
genres ["classic", "pop", "classic", "classic", "pop"] plays [500, 600, 150, 800, 2500] // [4, 1, 3, 0]
기준에 따라서 문제를 정리해보면
- 어떤 장르가 많이 재생된지를 찾아야 됨
- 많이 재생된 장르부터 재생횟수를 크기별로 조사해서 고유번호를 return (고유번호는 배열의 index번호)
- 1번을 해결하기 위해서 빈 객체를 하나 생성해서 장르가 몇개 있고, 각 총합이 몇인지를 조사
- 총합을 기준으로 오름차순된 배열을 하나 만들기 // [["pop",3000],["classic",1500]] 이런 식으로
- genres 배열에서 재생횟수 많은 장르부터 찾아서 각 고유번호, 재생횟수를 찾아야함
- // map을 이용해서 {0->500},{1->600} 이런식으로 만들어 놓았는데, 이걸 이용해서 index 1이 'pop'이다 -> map.get(1)을 찾아서 list 배열에 [고유번호, 재생횟수]로 넣어준다 -> 끝까지 반복한 후 재생횟수를 기준으로 오름차순 정렬해서 순서대로 result 배열에 고유번호 push
- 각 장르마다 두개씩 넣을 수 있지만, 장르가 한개만 있을 수도 있는 점 고려해줘야됨
- 재생횟수가 같으면 고유번호가 낮은 노래를 먼저 수록해야 하는데, 이 경우 index가 낮은 값부터 list라는 배열에 넣고 있고, sort 알고리즘 상 같은 재생횟수가 있다면 두 요소의 위치를 바꾸지 않기 때문에 자연스럽게 고유번호가 작은 값이 앞에 존재하는듯
코드
function solution(genres, plays) {
//장르별로 재생횟수 체크
//index -> plays
const result = []
const map = new Map()
const length = genres.length
const 총합 = {}
const arr = []
for(let i=0;i<length;i++){//장르 우선순위 구하기
const genre = genres[i]
총합[genre] = 총합[genre] ? 총합[genre] + plays[i] : plays[i]
map.set(i,plays[i])
}
for(let i of Object.entries(총합)){
arr.push(i)
}
arr.sort((a,b) => b[1] - a[1])
for(let 장르 of arr){
let list = []
for(let i=0;i<length;i++){
if(genres[i] === 장르[0]){
list.push([i,map.get(i)])
}
}
list.sort((a,b) => b[1] - a[1])
for(let i=0;i<2;i++){
if(list[i]){
result.push(list[i][0])
}}
}
return result
}
사실 수정할 수 있는 부분이 많은거 같긴한데... 문제가 널널해서 이정도만 해도 통과하는거 같음