728x90
코딩테스트 연습 문제 한바퀴 돌고 돌아오면 리펙토링이 시급하다 ㅠ.ㅠ
결과가 맞더라도 더 나은 코드를 위해 연구를!
function solution(genres, plays) {
let answer = [];
const len = genres.length; //노래갯수
const genresList = (function () { //고유번호 순서대로 한 리스트에 담기
const result = [];
for(let i=0; i<len; i++){
result.push([
genres[i], { no: i, play: plays[i] }
]);
}
return result;
});
/* 기준 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. */
// 기준 1-1. 장르별 재생횟수 합 구하기
//list로 구현해도 되나 Map에 익숙해지기 위해 의식적으로 사용 중입니다 ㅎㅎ
const genSumMap = new Map();
for(let i=0; i<len; i++) {
let nm = genres[i];
let play = plays[i];
let playSum = play;
if(genSumMap.has(nm))
playSum = genSumMap.get(nm).playSum+play;
genSumMap.set(nm, {'playSum': playSum});
}
// 기준 1-2. 정렬
let genSumMapKeys = [];
let iterObj = genSumMap.entries();
if(0<genSumMap.size) {
while (true) {
let iter = iterObj.next();
if(iter.done) {
break;
}
genSumMapKeys.push(iter.value);
}
}
genSumMapKeys.sort(function (a, b) {
let aps = a[1].playSum;
let bps = b[1].playSum;
return bps - aps; //재생횟수 sum 내림차순
});
for(let i=0; i<genSumMapKeys.length; i++){
let tempList = genresList().filter(gen=>gen[0]==genSumMapKeys[i][0]);
let tempLen = 2>tempList.length ? tempList.length : 2;
tempList.sort(function (a, b) {
let ap = a[1].play
let bp = b[1].play;
if(ap!=bp) {
return bp - ap; //다른 값이면 재생횟수 내림차순
} else {
return a[1].no - b[1].no; //조건3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 오름차순
}
});
for(let i=0; i<tempLen; i++){
answer.push(tempList[i][1].no);
}
}
return answer;
}
728x90
'Study Note > Algorithm' 카테고리의 다른 글
프로그래머스 #월간 코드 챌린지 시즌1 - 두 개 뽑아서 더하기 lv1 (0) | 2021.01.22 |
---|---|
프로그래머스 #정렬 - K번째수 lv1 (0) | 2021.01.20 |
프로그래머스 #스택/큐 - 기능개발 lv2 (0) | 2021.01.16 |
프로그래머스 #해시 - 위장 lv2 (0) | 2021.01.10 |
프로그래머스 #해시 - 완주하지 못한 선수 lv1 (1) | 2020.10.16 |
댓글