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 |
29 | 30 | 31 |
Tags
- 큐
- pytorch
- vue3
- 프론트엔드
- Machine Learning
- alexnet
- RxJS
- 자바스크립트
- 스택
- GraphQL
- 코딩테스트
- 이진탐색
- 컨테이너
- 포인터
- 연결 리스트
- 타입스크립트
- 연결리스트
- 프로그래머스
- 웹팩
- 해시테이블
- 알고리즘
- 릿코드
- APOLLO
- 프로세스
- RT scheduling
- 자료구조
- C
- 배열
- cors
- 브라우저
Archives
- Today
- Total
프린세스 다이어리
[프로그래머스] 자바스크립트 베스트 앨범 문제 해설 본문
728x90
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