본문 바로가기

알고리즘구현능력/문제해결능력

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//속한 노래가 많이 재생된 장르를 먼저 수록한다.
//장르 내에서 많이 재생된 노래를 먼저 수록한다.
//장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
//문자열 배열 genrse 노래별 재생횟수를 나타내는 정수 배열이 주어진다.
// 노래의 고유 번호를 고유 번호를 순서대로 retrn 하도록  solution 함수 완성,
//제한사항 1. genres[i]는 고유번호가 i인 노래의 장르
// 2. plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
// genres와 plays의 길이는 같다. 길이는 1 이상 10000이하입니다.
// 장르 종류는 100개 미만입니다.
//장르에 속한 곡이 하나라면 하나의 곡만 선택합니다.
//두 개씩 출시.. 장르별..
 
/*
우선 순위 
1. 속한 노래가 많은 장르 부터
2. 장르 내에서 많이 재성된 노래 
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록한다.
*/
function solution(genres, plays) {
    var answer = [];
    // 장르별 곡 개수 만드든 객체 만들기
    let objectTotal =[];
    for(let i=0;i<genres.length;i++){
       let index = objectTotal.findIndex(e=>e.name===genres[i]);
        if(index < 0){ //값이 없을때..
            objectTotal.push({
                name : genres[i],
                val  : plays[i]
            })
        }
        else{
            objectTotal[index].val+= plays[i]; //기존값에서 합치기
        }
 
    }
    //장르별 많이 재생된 노래별로 정리
    //재생횟수가 같은 노래일경우 고유 번호가 낮은 노래를 먼저 수록한다.
    let objectSort = {};
    for(let i=0;i<plays.length;i++){
       if(!objectSort[genres[i]]){
          objectSort[genres[i]] = [];
       }
        objectSort[genres[i]].push(plays[i]+" "+i); //횟수랑 인덱스 값으로 같이저장..
    }
//sort하는 부분... 장르별로
    for(let key in objectSort){
        objectSort[key].sort(function(a,b){
            if(Number(a.substring(a,a.indexOf(" "))) === Number(b.substring(b,b.indexOf(" ")))){
                return Number(a.substring(a.indexOf(" "))) - Number(b.substring(b.indexOf(" ")));
            }
            else{
                return  - ( Number(a.substring(a,a.indexOf(" "))) - Number(b.substring(b,b.indexOf(" ")))) ;
            }
        })
    }
 
    objectTotal.sort(function(a,b){
        return b.val - a.val  //올림차순..
    })
    for(let i=0;i<objectTotal.length;i++){
        for(let j=0;j<2;j++){
            let result = objectSort[objectTotal[i].name][j];
            if(!result){
                continue//이부분이 필요한 이유가 있다... 한개일때는 그냥 넘겨야한다..
            }
            result = result.substring(result.indexOf(" "));
            result = Number(result);
            answer.push(result);
        }
    }
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter