Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- GraphQL
- vue3
- 릿코드
- 타입스크립트
- 자바스크립트
- 포인터
- APOLLO
- 이진탐색
- RxJS
- cors
- 해시테이블
- pytorch
- 큐
- 알고리즘
- alexnet
- 연결리스트
- 프로세스
- 배열
- 프론트엔드
- 연결 리스트
- 코딩테스트
- Machine Learning
- 웹팩
- 프로그래머스
- 브라우저
- C
- 자료구조
- 스택
- RT scheduling
- 컨테이너
Archives
- Today
- Total
프린세스 다이어리
[프로그래머스] 자바스크립트 베스트 앨범 문제 해설 본문
728x90
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
1. 접근 방법
(0) 일단 문제가 해시 카테고리에 있다는 점을 참고해 map을 생성하여 작성함.
(1) map에 장르별로 key에 장르를, value에 각 곡의 인덱스와 실행 횟수를 배열로 넣어주고, 문제의 조건대로 value 정렬하기
let map = new Map();
for (let i = 0; i < genres.length; i++) {
if (map.get(genres[i])) {
map.set(genres[i], [...map.get(genres[i]), {idx: i, count: plays[i]}]);
} else {
map.set(genres[i], [{idx: i, count: plays[i]}])
}
const temp = map.get(genres[i])
temp.sort((a,b) => b.count - a.count);
temp.sort((a,b) => {
if (a.count === b.count) {
a.idx - b.idx
}
});
map.set(genres[i], temp);
}
(2) array 하나를 생성해 장르별로 장르 이름과 실행횟수실행 횟수 합계를 object로 저장함. 그리고 실행 횟수 내림차순으로 정렬함.
let array = [];
for (let genre of map.keys()) {
const temp = map.get(genre); // []
const total = temp.reduce((acc, cur) => acc + cur.count, 0);
array.push({
genre: genre,
total: total,
})
}
array.sort((a, b) => b.total - a.total);
(3) 정답을 담을 answer 배열 하나를 생성해, 위에서 최다 실행 횟수 순으로 정렬한 array를 돌면서 곡 최대 2개씩 빼내어 answer에 담음
let answer = [];
for (let i = 0; i < array.length; i++) {
const topSongs = map.get(array[i].genre); // [{}, {}, {}, ...]
const sliced = topSongs.slice(0, 2); // [{}, {}]
if (sliced.length >= 2) {
answer = [...answer, sliced[0].idx, sliced[1].idx]; // sliced가 원소가 1이하인 경우엔???
} else {
answer = [...answer, sliced[0].idx]
}
}
2. 전체 해답
function solution(genres, plays) {
// 1. map에 장르별로 하나씩 넣어주고 각각 value 정렬하기
let map = new Map();
for (let i = 0; i < genres.length; i++) {
if (map.get(genres[i])) {
map.set(genres[i], [...map.get(genres[i]), {idx: i, count: plays[i]}]);
} else {
map.set(genres[i], [{idx: i, count: plays[i]}])
}
const temp = map.get(genres[i])
temp.sort((a,b) => b.count - a.count);
temp.sort((a,b) => {
if (a.count === b.count) {
a.idx - b.idx
}
});
map.set(genres[i], temp);
}
// array에 장르별로 합계를 object로 넣기
let array = [];
for (let genre of map.keys()) {
const temp = map.get(genre); // []
const total = temp.reduce((acc, cur) => acc + cur.count, 0);
array.push({
genre: genre,
total: total,
})
}
array.sort((a, b) => b.total - a.total);
// array에서 장르 하나씩 꺼내면서 2개
let answer = [];
for (let i = 0; i < array.length; i++) {
const topSongs = map.get(array[i].genre); // [{}, {}, {}, ...]
const sliced = topSongs.slice(0, 2); // [{}, {}]
if (sliced.length >= 2) {
answer = [...answer, sliced[0].idx, sliced[1].idx]; // sliced가 원소가 1이하인 경우엔???
} else {
answer = [...answer, sliced[0].idx]
}
}
return answer;
}
728x90
'자료구조, 알고리즘' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 - 자바스크립트 풀이 (0) | 2021.11.26 |
---|---|
[프로그래머스] 입국심사 문제 - 파이썬 풀이 (0) | 2021.11.25 |
[프로그래머스] 자바스크립트 위장 문제 - 해시 (0) | 2021.11.16 |
[프로그래머스] 자바스크립트 완주하지 못한 선수 문제 - 해시 (0) | 2021.11.15 |
자바스크립트 해시 테이블 충돌 해결하는 방법 2가지 (0) | 2021.11.14 |
Comments