여러가지 genres의 종류가 들어올 수 있으며, 이 때, O(1) 이라는 적은 시간복잡도로 찾기 위해서는 hash를 사용하면 손쉽게 해결이 가능하다.
hash map을 구성할때, 들어가야할 정보들은 다음과 같다.
const map = {
//genreName,
//plays
//array {
// index,
// plays
//}
}
다음과 같이 들어가게 되며, 정렬을 두번에 걸쳐서 진행한다.
처음에는 map에 대한 정렬, plays 를 기준으로 정렬을 진행한다.
그 다음에는 정렬된 genres 내부에서, plays 와 index 를 기준으로 정렬하며,
그 이후에는 정렬된 값들중 최대 2개까지만 answer에 추가할 수 있도록 제한한다.
function solution(genres, plays) {
var answer = [];
const map = {
//genreName,
//plays
//array {
// index,
// plays
//}
}
for(let i=0; i< genres.length; i++){
if(map[genres[i]]){// 장르를 가지고 있다면,
map[genres[i]].plays+= plays[i]
map[genres[i]].array.push({
index : i,
plays : plays[i]
})
}else{ // 장르를 가지고 있지 않다면,
map[genres[i]] = {
genreName : genres[i],
plays : plays[i],
array : [{
index : i,
plays : plays[i]
}]
}
}
}
const genresArray = []
for(let val in map){
genresArray.push(map[val])
}
//정렬을 진행합니다.
genresArray.sort((a,b) => {
if(a.plays> b.plays){
return -1
}else{
return 1
}
})
for(let i=0; i< genresArray.length; i++){
const curArray = genresArray[i].array;
curArray.sort((a,b) => {
if(a.plays > b.plays){
return -1
}else if(a.plays < b.plays){
return 1
}else{
if(a.index < b.index){
return -1
}else{
return 1
}
}
})
for(let i =0; i < curArray.length; i++){
if(i === 2){ // 여기서 2개 이상이 출력되지 않도록 막는다.
break;
}else{
answer.push(curArray[i].index)
}
}
}
return answer;
}