[프로그래머스] 베스트앨범 - JavaScript

김동선·2022년 10월 20일
0
post-thumbnail
post-custom-banner

문제풀이

function solution(genres, plays) {
    var answer = [];
    const obj = {}
    
    // 1.
    for(let i = 0; i < genres.length; i++){
        obj[genres[i]] = obj[genres[i]] ? obj[genres[i]] + plays[i] : plays[i]
    }
  	// obj =  { classic: 1450, pop: 3100 }
    
  	// 2.
    const entries = Object.entries(obj).sort((a, b) => b[1] - a[1])
    // entries = [ [ 'pop', 3100 ], [ 'classic', 1450 ] ]
    
    // 3.
    const allInfoObj = genres.map((genre, index) => ({
        genre,
        index,
        playCnt: plays[index]
    })) 
    // allInfoObj = [
  	// 	{ genre: 'classic', index: 0, playCnt: 500 },
  	// 	{ genre: 'pop', index: 1, playCnt: 600 },
  	// 	{ genre: 'classic', index: 2, playCnt: 150 },
  	// 	{ genre: 'classic', index: 3, playCnt: 800 },
  	// 	{ genre: 'pop', index: 4, playCnt: 2500 }
	// ]
    
    // 4.
    entries.forEach((k, i) => {
        const current = [];
        
        for(let j = 0; j < allInfoObj.length; j++) {
            if (k[0] === allInfoObj[j].genre) {
                current.push(allInfoObj[j]);
            }
        }
      	// 5.
        current.sort((a, b) => b.playCnt - a.playCnt);
        current.forEach((c, i) => {
            if (i < 2) {
                answer.push(c.index)
            }        
        })
    })
    
    return answer;
}
  1. 먼저 장르별 플레이 합을 Object형식으로 만든다.
  2. Object.entries를 사용하여 플레이 합을 기준으로 sort 해준다.
  3. allInfoObj라는 변수에 genre, index, playCnt를 담은 Object 배열을 만든다.
  4. current 배열에 allInfoObj genre가 같은 Object를 푸쉬한다.
  5. playCnt로 sort한 뒤 앞에 2번째까지 answer에 푸쉬한다.

느낀점

프로그래머스 기준 Level 3이다. 내 기준 3단계 치고는 어렵진 않았던 것 같다.
Array에서 find하는 것보다 Hash를 활용하여 바로 원하는 값을 찾아내는 것이 더 빠르다.
실무에서도 배열끼리 비교하는 경우가 많은데 Hash를 잘 활용하여 로직의 속도를 개선할 수 있다.

profile
Nuxt, Nest 개발자
post-custom-banner

0개의 댓글