본문 바로가기

Web/Algorithm

[프로그래머스 > 해시] 베스트 앨범

프로그래머스 문제 읽을 때면 종종 읽어도 읽은 것 같지 않은 느낌이 들 때가 많다.ㅎㅎ 

많이 풀어보면 쉬워지겠지..ㅎㅎ흑

문제) 

과정)

첫번째, 스트리밍 총합이 큰 장르 순으로 내림차순 정렬 되어야 하고,

두번째, 각 장르별 스트리밍 수가 많은 노래를 내림차순 정렬

세번째, 정렬된 상태에서 각 장르별로 노래 두개를 뽑아야 한다.

장르에 노래가 하나 뿐일 경우 하나만 뽑는다.

총 반환되는 값은 장르*2 ( - 알파)가 된다.

내가 재출한 해설)

function solution(genres, plays) {
    let answer = [];
                let genres_ = Array.from(new Set(genres)); //중복 제거한 장르만 모아놓음 
                let target = [];
                genres_.forEach((gen, id) => { //각 장르에 포함된 노래들을를 해시구조로 만들어 준다.
                    target[id] = genres.map((element, index) => { if(gen === element){
                        return {song_title:index, play:plays[index]};}else{return null} });
                });

                target.forEach((element, index) => {
                    target[index] = element.filter(v=>{return v !== null}); // 위 과정에서 생긴 null값 제거해주고
                    target[index].sort((prev, next) => { //장르에 속한 노래들 스밍 수로 내림차순 정렬
                        return next.play - prev.play;
                    });
                }); 

                target.forEach(function(element, index){ //장르별 스밍 수 총합 구해준다.
                    let sum = 0;
                    element.forEach((e) => { sum += e.play});
                    target[index].push(sum);
                    sum = 0;
                });

                target.sort((prev, next) => {//스밍 수 기준으로 장르 내림차순 정렬
                    return next[next.length-1] - prev[prev.length-1];
                });

                let count = 0;
                while ( genres_.length > count) {
                    if(target[count].length >= 3 ){
                        for(let i = 0; i < 2; i++ ){ //장르 안에 속한 노래가 2곡 이상일 경우 
                            answer.push(target[count][i].song_title);
                        }
                    }else if(target[count].length <= 2){
                    	for(let i = 0; i <1; i++ ){ //장르 안에 속한 노래가 1곡일 경우 
                            answer.push(target[count][i].song_title);
                        }
                    }
                    count++;
                }
                return answer;
}

 

후기) 자꾸 for문을 쓰게 되니까 뭔가 잘못하고 있는 건가 싶기도 하고...ㅋㅋ