프로그래머스/해시
[해시] 프로그래머스 '베스트 앨범' - js
bbeyak
2022. 11. 7. 19:53
반응형
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;
}
반응형