[해시] 배스트앨범
조건
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
제한사항
- genres[i]는 고유번호가 i인 노래의 장르입니다.
- plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
- genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
- 장르 종류는 100개 미만입니다.
- 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
- 모든 장르는 재생된 횟수가 다릅니다.
입출력 예
genres plays return [classic, pop, classic, classic, pop] [500, 600, 150, 800, 2500] [4, 1, 3, 0]
코드
function solution(genres, plays) {
//조건 1. 장르 총 합 순으로 정렬(내림차순)
//조건 2. 장르 중 높은 플레이순 2개만 출력
//{총재생수, [{인덱스, 재생수}]}
//장르를 object의 프로퍼티로 저장, 그 프로퍼티에 {총 재생수, 인덱스 달기}
if (genres.length === 1) return [0];
let best_album = {};
genres.map((genre, index) => {
if (!best_album[genre]) {
best_album[genre] = { allplay: plays[index], plays: [{ index: index, play: plays[index] }] };
} else {
best_album[genre].allplay += plays[index];
best_album[genre].plays.push({ index: index, play: plays[index] });
}
});
let sort_array = Object.keys(best_album);
if (sort_array.length > 1) {
sort_array.sort((a, b) => {
return best_album[b].allplay - best_album[a].allplay;
});
}
let answer = [];
sort_array.map(value => {
const plays = best_album[value].plays;
if (plays.length > 1) {
plays.sort((a, b) => {
return b.play - a.play;
});
answer.push(plays[0].index);
answer.push(plays[1].index);
} else answer.push(plays[0].index);
});
return answer;
}
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges