본문 바로가기

프로그래머스/해시

[해시] 프로그래머스 '베스트 앨범' - js

반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2. 설명

해당 문제의 설명은 주석으로 대신한다.

Object를 사용하여 해쉬 테이블을 만드는 방식을 사용했다.

3. 코드

function solution(genres, plays) {
    let answer = [];
    // 장르 별 재생 횟수 저장하는 객체
    let totalPlays = {};
    // 각 노래 별 장르, 재생 횟수, 인덱스 저장하는 객체
    let playList = {};
    for(let i=0; i<genres.length; i++){
        totalPlays[genres[i]] = (totalPlays[genres[i]] || 0) + plays[i];
        // 객체에 그 노래의 장르 키 값에 해당하는 벨류가 이미 있으면 그 벨류값에 해당하는 배열에 push
        // 없으면 빈 배열에 push
        let arr = (playList[genres[i]] || []);
        arr.push({genres: genres[i], plays: plays[i], no: i});
        // playList 객체 해당 장르 키값에 해당하는 벨류로 arr를 재할당
        playList[genres[i]] = arr;
    }
 	// 재생 횟수를 기준으로 내림차순 
    let totalPlaysArr = Object.keys(totalPlays).sort((a, b) => totalPlays[b] - totalPlays[a]);
    // 각 장르마다 노래 재생횟수가 많은 순으로 내림차순 해준 후,
    // 해당 장르에 노래가 한 개라면 한개만, 두개 이상이면 두번째 노래까지 인덱스 추출
    for(let i=0; i<totalPlaysArr.length; i++){
        playList[totalPlaysArr[i]].sort((a, b) => b.plays - a.plays);
        answer.push(playList[totalPlaysArr[i]][0].no);
        if(playList[totalPlaysArr[i]][1]){
            answer.push(playList[totalPlaysArr[i]][1].no);
        }
    }
    return answer;
}
반응형