자료구조, 알고리즘
[프로그래머스] 자바스크립트 베스트 앨범 문제 해설
개발공주
2021. 11. 17. 12:49
728x90
1. 접근 방법
(0) 일단 문제가 해시 카테고리에 있다는 점을 참고해 map을 생성하여 작성함.
(1) map에 장르별로 key에 장르를, value에 각 곡의 인덱스와 실행 횟수를 배열로 넣어주고, 문제의 조건대로 value 정렬하기
let map = new Map();
for (let i = 0; i < genres.length; i++) {
if (map.get(genres[i])) {
map.set(genres[i], [...map.get(genres[i]), {idx: i, count: plays[i]}]);
} else {
map.set(genres[i], [{idx: i, count: plays[i]}])
}
const temp = map.get(genres[i])
temp.sort((a,b) => b.count - a.count);
temp.sort((a,b) => {
if (a.count === b.count) {
a.idx - b.idx
}
});
map.set(genres[i], temp);
}
(2) array 하나를 생성해 장르별로 장르 이름과 실행횟수실행 횟수 합계를 object로 저장함. 그리고 실행 횟수 내림차순으로 정렬함.
let array = [];
for (let genre of map.keys()) {
const temp = map.get(genre); // []
const total = temp.reduce((acc, cur) => acc + cur.count, 0);
array.push({
genre: genre,
total: total,
})
}
array.sort((a, b) => b.total - a.total);
(3) 정답을 담을 answer 배열 하나를 생성해, 위에서 최다 실행 횟수 순으로 정렬한 array를 돌면서 곡 최대 2개씩 빼내어 answer에 담음
let answer = [];
for (let i = 0; i < array.length; i++) {
const topSongs = map.get(array[i].genre); // [{}, {}, {}, ...]
const sliced = topSongs.slice(0, 2); // [{}, {}]
if (sliced.length >= 2) {
answer = [...answer, sliced[0].idx, sliced[1].idx]; // sliced가 원소가 1이하인 경우엔???
} else {
answer = [...answer, sliced[0].idx]
}
}
2. 전체 해답
function solution(genres, plays) {
// 1. map에 장르별로 하나씩 넣어주고 각각 value 정렬하기
let map = new Map();
for (let i = 0; i < genres.length; i++) {
if (map.get(genres[i])) {
map.set(genres[i], [...map.get(genres[i]), {idx: i, count: plays[i]}]);
} else {
map.set(genres[i], [{idx: i, count: plays[i]}])
}
const temp = map.get(genres[i])
temp.sort((a,b) => b.count - a.count);
temp.sort((a,b) => {
if (a.count === b.count) {
a.idx - b.idx
}
});
map.set(genres[i], temp);
}
// array에 장르별로 합계를 object로 넣기
let array = [];
for (let genre of map.keys()) {
const temp = map.get(genre); // []
const total = temp.reduce((acc, cur) => acc + cur.count, 0);
array.push({
genre: genre,
total: total,
})
}
array.sort((a, b) => b.total - a.total);
// array에서 장르 하나씩 꺼내면서 2개
let answer = [];
for (let i = 0; i < array.length; i++) {
const topSongs = map.get(array[i].genre); // [{}, {}, {}, ...]
const sliced = topSongs.slice(0, 2); // [{}, {}]
if (sliced.length >= 2) {
answer = [...answer, sliced[0].idx, sliced[1].idx]; // sliced가 원소가 1이하인 경우엔???
} else {
answer = [...answer, sliced[0].idx]
}
}
return answer;
}
728x90