개요
- 난잡하게 풀었다. 가장 확실하지만 그만큼 무식하기도 한 풀이.
- 객체의 정의는 주요 객체인 genre_obj로 정의했으며, 인덱스와 플레이타임 객체를 요소로 갖는 배열이 프로퍼티 값.
genre_obj = {classic: [ {idx:--, play_time: --} ...], pop: [...]};
- sort 메서드를 이용해서 play_time 순으로 내림차순해준다. (이때 비교함수 작성시, return 값을 지정 안해주면 적용 안됨 주의하자)
- sum_arr 배열이 장르 정보와 플레이시간 총합을 객체의 형태로 담고 있도록 한 후, 마찬가지로 sort 메서드를 통해 내림차순 해준다.
- sum_arr 배열의 요소들을 key값으로 genre_obj의 요소들을 조건에 맞게 꺼내어 answer 배열에 담아준 후, return한다.
JS CODE (1) - 내 풀이
function solution(genres, plays) {
const answer = [];
const genres_obj = genres.reduce((result, value, index) => {
if (!result[value]) result[value] = [];
return result;
}, {});
plays.forEach((value, index) => {
let key = genres[index];
genres_obj[key].push({ idx: index, play_time: value });
});
const sum_arr = [];
for (let key in genres_obj) {
let genres_obj_arr = genres_obj[key];
genres_obj_arr.sort((a, b) => {
return b.play_time - a.play_time;
});
let sum = 0;
for (let obj of genres_obj_arr) {
sum += obj.play_time;
}
sum_arr.push({ genres: key, sum: sum });
}
sum_arr.sort((a, b) => {
return b.sum - a.sum;
});
for (let sum_obj of sum_arr) {
let key = sum_obj.genres;
let genres_obj_arr = genres_obj[key];
answer.push(genres_obj_arr[0].idx);
if (genres_obj_arr.length >= 2) answer.push(genres_obj_arr[1].idx);
}
return answer;
}
- 객체의 프로퍼티 접근
1. 유효한 자바스크립트 이름이며 예약어가 아닌 경우 : 마침표, 대괄호로 모두 접근 가능
2. 이 반대는 대괄호로만. (이때 대괄호 안에 들어가는 프로퍼티 이름은 문자열이어야 함)
JS CODE (2) - 프로그래머스 우수풀이
function solution(genres, plays) {
var dic = {};
genres.forEach((t,i)=> {
dic[t] = dic[t] ? dic[t] + plays[i] :plays[i];
});
var dupDic = {};
return genres
.map((t,i)=> ({genre : t, count:plays[i] , index:i}))
.sort((a,b)=>{
if(a.genre !== b.genre) return dic[b.genre] - dic[a.genre];
if(a.count !== b.count) return b.count - a.count;
return a.index - b.index;
})
.filter(t=> {
if(dupDic[t.genre] >= 2) return false;
dupDic[t.genre] = dupDic[t.genre] ? dupDic[t.genre]+ 1 : 1;
return true;
})
.map(t=> t.index);
}
- 메서드 체이닝을 이용해서(반환값이 배열인 메서드들만 붙여놓아서 가능함) 한 큐에 정리... (말이 되는 코드인가?)
- 섹시하다고 느낀 포인트는 두가지.
1. sort의 다중 조건 : if 문 두번과 return을 이용해서 세가지 조건으로 정렬하도록 함
2. filter 메서드 : 2개까지만 넘기기 위해서 작성한 코드같은데, 발상이 훌륭함
- 이런 코드를 구현하려면 배열의 메서드에 대한 이해도가 높아야할 듯하다.
'알고리즘 > 해시' 카테고리의 다른 글
[JavaScript] Programmers 위장 (0) | 2022.05.03 |
---|---|
[JavaScript] Programmers 완주하지 못한 선수 (0) | 2022.05.03 |