문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 생각
정렬 기준이 무려 세가지다!
- 속한 노래가 많이 재생된 장르를 먼저 수록
- 장르 내에서 많이 재생된 노래를 먼저 수록
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록
그래서 일단 Map을 생성한 후,
속한 노래가 많이 재생된 장르를 먼저 수록하기 위해
genres와 plays를 순회를 돌며 genres 별로 plays들을 더해줘서 plays가 큰 순서대로 Map을 내림차순 정렬을 해주었다. (이 때, Map을 정렬해주기 위해서 Map을 배열로 바꾸고 정렬을 해주었다)
그러면 이제 1번 기준으로 장르를 정렬해주었다. (모든 장르는 재생된 횟수가 다르다는 조건이 있으므로 같은 경우는 생각하지 않아도 된다)
그리고 배열을 다시 Map으로 바꾸어주고, Map의 key를 순회를 돈다. 새로운 Map을 만들어주고, key 값이 인덱스(고유번호), value가 plays(재생 횟수)인 요소들을 Map에 넣어준다.
그리고 2번 기준과 3번 기준을 바탕으로 정렬을 진행해주는데, 고유번호가 다른 요소들끼리는 재생횟수가 더 큰 요소가 앞에 오도록, 재생횟수가 같은 요소들 끼리는 고유번호가 낮은 요소가 더 앞으로 오도록 정렬을 해주었다.
그리고 answer 배열에 위 배열의 첫 번째 인덱스의 값과 두 번째 인덱스 값을 push해주는 작업을 반복했다.
2. 코드
function solution(genres, plays) {
const answer = [];
const map = new Map();
// 각 장르별 plays의 합을 value에 더해줌
for(let i = 0; i < genres.length; i++) {
map.set(genres[i], map.get(genres[i]) + plays[i] || plays[i])
}
// 정렬을 위해 map을 배열로 바꿈
const array = [...map];
// plays의 총합을 기준으로 장르를 내림차순 정렬
const sortedMap = new Map(array.sort((a, b) => b[1] - a[1]));
// 장르별로 순회를 돌며 고유번호, plays로 Map 생성
sortedMap.forEach((value, key) => {
const map2 = new Map();
for(let i = 0; i < genres.length; i++) {
if(genres[i] === key) {
map2.set(i, plays[i]);
}
}
const array2 = [...map2];
array2.sort((a, b) => {
// 만약 plays가 다르면 plays가 더 큰 요소가 앞으로 오게 정렬
if(a[0] !== b[0]) {
return b[1] - a[1];
}
// 만약 plays가 같으면 고유번호가 낮은 요소가 먼저 앞으로 오게 정렬
return a[0] - b[0];
});
let count = 0;
for(let i = 0; i < array2.length; i++) {
if(count === 2){
break;
}
answer.push(array2[i][0]);
count++;
}
})
return answer;
}
Map을 정렬하기 위하여 배열로 변환시켜주고, 정렬 후 다시 Map으로 바꾸는 작업에 익숙해질 수 있었다.
또한, sort를 할 때 두 가지 기준으로 정렬을 할 수 있다는 사실 또한 알 수 있었던 문제였다.
'Programmers(JavaScript)' 카테고리의 다른 글
[프로그래머스 자바스크립트] ‘디스크 컨트롤러’ 풀기 (0) | 2025.03.09 |
---|---|
[프로그래머스 자바스크립트] ‘다리를 지나는 트럭’ 풀기 (1) | 2025.03.03 |
[프로그래머스 자바스크립트] ‘네트워크’ 풀어보기 (0) | 2025.01.27 |
[프로그래머스 자바스크립트] ‘정수 삼각형’ 풀어보기 (0) | 2025.01.24 |
[프로그래머스 자바스크립트] ‘가장 큰 수’ 풀어보기 (0) | 2025.01.20 |