문제 유형 : 해쉬, 객체
https://school.programmers.co.kr/learn/courses/13213/lessons/91081
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이 과정
1. 우선 장르별로 총 재생횟수의 합을 저장해놓은 후, 재생 횟수별로 내림차순 정렬을 해놓는 과정이 필요하다. ex) [{pop:3100},{classic:1450}]과 같은 형태
2. 고유번호, 장르, 재생횟수가 한데에 모아져있는 객체가 필요하다.
[
{ genre: 'classic', index: 0, playCnt: 500 },
{ genre: 'pop', index: 1, playCnt: 600 },
{ genre: 'classic', index: 2, playCnt: 150 },
{ genre: 'classic', index: 3, playCnt: 800 },
{ genre: 'pop', index: 4, playCnt: 2500 }
]
3. 2번 배열에서 1번 배열 객체의 키값에 해당하는 장르들을 배열에 따로 저장해서 재생횟수 별로 내림차순 정렬을 한 후, 상위 두개 원소의 고유번호만 뽑아서 answer 배열에 push 해준다.
핵심 Point
- 배열을 조작하여 Json 객체 만드는 방법
- {}를 ()로 감싸야 한다. (주의)
전체 코드
function solution(genres, plays) {
// 1. 장르별 노래 재생 횟수 총 합 객체
let playCntByGenre = {}
for(let i = 0; i < genres.length; i++){
// 해당 키가 없으면 처음엔 undefiend
// 해당 키가 있다면 value 값을 증가시키고 없으면 새로운 키와 값을 넣는다
//playCntByGenre[genres[i]] ? playCntByGenre[genres[i]]+=plays[i] : playCntByGenre[genres[i]] = plays[i]
playCntByGenre[genres[i]] = playCntByGenre[genres[i]] ? playCntByGenre[genres[i]]+plays[i] : plays[i]
}
//console.log(playCntByGenre) // { classic: 1450, pop: 3100 }
// 2. 재생 수에따른 내림차순 정렬
let keyValueArr=Object.entries(playCntByGenre);
keyValueArr.sort((a,b) => b[1]-a[1]);
//console.log(keyValueArr) // [ [ 'pop', 3100 ], [ 'classic', 1450 ] ]
// 3. 종합 관리 객체 (index, genres, plays) join 과정 ? 괄호 2개
const allInfo = genres.map((g,idx) => ({
genre: g,
index: idx,
playCnt: plays[idx]
}))
// console.log(allInfo);
// 4. 상위 재생 2개만 push
let answer = [];
keyValueArr.forEach( k =>{
let fake = [];
for(let j = 0; j<allInfo.length; j++){
if(k[0] === allInfo[j].genre){
fake.push(allInfo[j]);
}
}
fake.sort((a,b) => b.playCnt - a.playCnt);
// fake.forEach((c,i) =>{
// if(i<2) answer.push(c.index)
// else return false; // 최적화 탈출
// })
fake.slice(0,2).map((it,idx) => answer.push(it.index))
}) // 해당 장르 종료
return answer
}
'JavaScript > 알고리즘(JS)' 카테고리의 다른 글
[프로그래머스 레벨1] 폰켓몬 [Javascript/해쉬] (0) | 2023.03.04 |
---|---|
[프로그래머스 레벨1] 완주하지 못한 선수 [Javascript/해쉬, 정렬] (0) | 2023.03.04 |
[ALGO#07] 프로그래머스 레벨2 귤 고르기 [Javascript] (0) | 2023.03.01 |
[ALGO#06] 프로그래머스 레벨2 기능개발 [Javascript] (0) | 2023.02.28 |
[ALGO#05] 프로그래머스 레벨0 배열 두배 만들기 [Javascript] (0) | 2023.02.01 |