-
[프로그래머스/JavaScript] 베스트앨범 (Feat. 첫 Lv3)IT Study/프로그래머스 2023. 11. 6. 14:49728x90
초기 코드
function solution(genres, plays) { // 베스트 앨범에 들어갈 노래의 고유 번호를 저장하는 Array let answer = []; // 장르 별 총 재생 수를 나타내는 Map let genreTotalPlayMap = new Map(); for (let i = 0; i < genres.length; i++) { const genre = genres[i]; const play = plays[i]; if (genreTotalPlayMap.has(genre)) { genreTotalPlayMap.set(genre, genreTotalPlayMap.get(genre) + play); } else { genreTotalPlayMap.set(genre, play); } } // 장르별 재생 수 높은 순으로 나타내기 위한 Array let genreTotalPlayArray = Array.from(genreTotalPlayMap); genreTotalPlayArray.sort((a, b) => { if (a[1] > b[1]) { return -1; } if (a[1] < b[1]) { return 1; } return 0; }); // 장르별 재생 수를 나타내는 Map let genrePlayMap = new Map(); for (let i = 0; i < genres.length; i++) { const genre = genres[i]; const play = plays[i]; if (genrePlayMap.has(genre)) { const playData = genrePlayMap.get(genre); playData.push({play: play, index: i}); playData.sort((a, b) => { if (a.play > b.play) { return -1; } if (a.play < b.play) { return 1; } return; }) genrePlayMap.set(genre, playData); } else { genrePlayMap.set(genre, [{play: play, index: i}]); } } // 상위 2개 노래를 나타내어 담기 for (let genre of genreTotalPlayArray) { const data = genrePlayMap.get(genre[0]); answer.push(data[0].index, data[1].index); } return answer; }
코드가 많이 길죠...
(1) 장르별 총 재생 수를 계산하는 genreTotalPlayMap를 생성하였습니다.
(2) 위 Map을 배열로 변환하고 내림차순으로 정렬하여 genreTotalPlayArray를 생성하였습니다.
(3) 각 장르별로 각 노래의 재생 수와 인덱스를 저장하는 genrePlayMap를 생성하였습니다.
(4) 각 장르별 노래 정보를 재생 수가 높은 순으로 정렬하였습니다.
(5) 최종적으로 장르별로 가장 많이 재생된 두 곡의 인덱스를 answer 배열에 추가하였습니다.그러나 몇 가지 개선할 점이 있습니다.
(1) 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록해야 하는데, 이 부분을 반영하지 않았습니다.
(2) 장르에 속한 곡이 하나라면, 하나의 곡만 선택해야 하는데, 이 부분을 반영하지 않았습니다.최종 코드
function solution(genres, plays) { // 베스트 앨범에 들어갈 노래의 고유 번호를 저장하는 Array let answer = []; // 장르 별 총 재생 수를 나타내는 Map let genreTotalPlayMap = new Map(); // 장르별 재생 수를 나타내는 Map let genrePlayMap = new Map(); for (let i = 0; i < genres.length; i++) { const genre = genres[i]; const play = plays[i]; // 장르별 총 재생 수를 계산하여 genreTotalPlayMap에 저장 genreTotalPlayMap.set(genre, (genreTotalPlayMap.get(genre) || 0) + play); // 장르별 각 노래의 재생 수와 인덱스를 저장하여 genrePlayMap에 저장 if (genrePlayMap.has(genre)) { genrePlayMap.get(genre).push({play: play, index: i}); } else { genrePlayMap.set(genre, [{play: play, index: i}]); } } // 장르별 재생 수 높은 순으로 나타내는 Array let genreTotalPlayArray = Array.from(genreTotalPlayMap).sort((a, b) => b[1] - a[1]); for(let genre of genreTotalPlayArray) { let genrePlayArray = genrePlayMap.get(genre[0]); // 장르 내에서 노래를 재생 수가 높은 순으로, 재생 수가 같은 경우에는 인덱스가 낮은 순으로 정렬 genrePlayArray.sort((a, b) => b.play - a.play || a.index - b.index); // 가장 많이 재생된 노래의 인덱스를 answer에 추가 answer.push(genrePlayArray[0].index); // 두 번째로 많이 재생된 노래가 있다면 그 노래의 인덱스를 answer에 추가 if(genrePlayArray[1]) { answer.push(genrePlayArray[1].index); } } return answer; }
Lv3를 처음 풀어낸 것이라 좋지만, 조금 더 실력을 올려야겠습니다... :)
'IT Study > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JavaScript] 타겟 넘버 (Feat. DFS.. 재귀함수.. 너 뭔데) (2) 2023.12.01 [프로그래머스/JavaScript] 타겟 넘버 (Feat. forEach 함수) (0) 2023.11.07 [프로그래머스/JavaScript] 나머지가 1이 되는 수 찾기 (2) 2023.11.02 [프로그래머스/JavaScript] 달리기 경주 (Feat. 찾기 연산의 시간복잡도) (0) 2023.10.30 [프로그래머스/JavaScript] 주사위 게임 3 (Feat. Map) (0) 2023.10.11