코딩테스트/프로그래머스
프로그래머스 베스트앨범
의현
2025. 6. 4. 19:48
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=javascript
문제 풀이
같은 장르별로 묶기 위해 genres_dict을 사용, 또한 각 앨범 별 우선순위(1번 조건)을 파악하기 위해 총 갯수를 세는 count_dict 사용
1. count_dict을 dict형태를 array형태로 변환(Object.entries 메서드)을 해서 value값([, v1])을 기준으로 내림차순으로 sort진행 -> 정렬된 값중 key값을 리턴해서 count_dict에 저장
2. count_dict은 갯수로 내림차순 정렬이 되어있는 key값(genre문자열)이 저장되어있으므로 해당 key를 genres_dict에서 찾아 최대 2개 까지 출력하도록 구현
3. 각 장르별로 value(2번 조건)로 내림차순, id(3번 조건)로 오름차순으로 정렬하여 최대 2개 까지 answer에 저장
function solution(genres, plays) {
var answer = [];
let genres_dict = {};
let count_dict = {};
for (let i = 0; i < genres.length; i++) {
if (genres_dict[genres[i]]) {
genres_dict[genres[i]].push([i, plays[i]]);
} else {
genres_dict[genres[i]] = [[i, plays[i]]];
}
if (count_dict[genres[i]]) {
count_dict[genres[i]] += plays[i];
} else {
count_dict[genres[i]] = plays[i];
}
}
// count_dict 정렬
count_dict = Object.entries(count_dict).sort(([, v1], [, v2]) => v2 - v1).map(r => r[0]);
// genres_dict 정렬
for (const genre of count_dict) {
let target = genres_dict[genre];
// value(내림차순) -> id(오름차순) 순으로 정렬
target.sort(([k1, v1], [k2, v2]) => {
if (v1 !== v2) return v2 - v1;
return k1 - k2;
});
for (let i = 0 ; i < target.length; i++) {
if (i > 1) break;
answer.push(target[i][0]);
}
}
return answer;
}
결론
문제의 핵심은 dict형태로 같은 장르별로 묶고 해당 값을 sort하는 법을 알아야 함
-> dict을 array로 변환시켜 sort 메서드를 이용
+ 다시 객체형태({})로 만들기 위해서는 Object.fromEntries()를 써야 함 -> array를 object로 만들어줌 (위 문제에서는 다시 변환할 필요가 없어서 이 부분은 제외)