문제 해결
1. 해시
2. 주어진 genres와 plays를 객체 형태로 만든다.
(1) ex) { 장르이름: { 총 재생 횟수: 500, 노래들: [[200, 1], [300, 5]] }
3. 만들어진 객체를 총 재생 횟수로 내림차순 정렬한다.
4. 각각의 장르에서 노래를 두개씩 뽑아 answer 에 넣는다.
(1) 각각의 장르에서 노래들을 꺼내 내림차순 정렬한다.
(2) 그 때 재생횟수가 같다면 인덱스로 오름차순 정렬한다.
(3) 정렬 후 노래를 두개 꺼내 answer 에 넣는다
(4) 만약 노래가 하나라면 정렬하지 않고 그냥 넣는다. ( 두개 일 경우에도 정렬은 필요 없으나 노래가 하나인지 그 이상인지가 중요하므로)
🌤 문제를 풀어 본 후 여러가지 풀이를 찾았다. 자바스크립트를 공부하는 목적은 알고리즘 해결 방법 보단 언어를 어떻게 어떤 함수를 이용하는지 이다. 주어진 인풋값을 객체화 했을 때 reduce 함수를 사용하는 것을 찾았다. reduce에서 누적값이라는 것을 이용하는 것 같다.
🚙 reduce
배열.reduce((누적값, 현재값, 인덱스, 요소) => { return 결과 }, 초기값)
var chart = genres.reduce((o, g, i) => {
if (!o[g]) {
o[g] = {playCount: plays[i], index: []};
} else {
o[g].playCount += plays[i];
}
o[g].index.push([i, plays[i]]);
return o;
}, {});
누적값 o, 초기값 {} : 이름이 o인 객체 {} 를만들어 반환한다.
소스 코드
function solution(genres, plays) {
var answer = [];
var chart = {}
// 인풋값 객체화
for (let i = 0; i < genres.length; i++) {
if (!chart[genres[i]]) {
chart[genres[i]] = {
playCount: plays[i],
index: [[plays[i], i]]
}
} else {
chart[genres[i]].playCount += plays[i]
chart[genres[i]].index.push([plays[i], i])
}
}
// 객체 정렬
var sorted = Object.values(chart).sort((l, r) => r.playCount - l.playCount);
// 정렬 후 각각의 장르에서 노래들을 정렬
sorted.forEach(genre => {
if (genre.index.length > 1) {
genre.index.sort((a,b) => {
if (a[0] > b[0]) {
return -1;
} else if (a[0] < b[0]) {
return 1;
} else {
if (a[1] > b[1]) {
return 1
} else {
return -1
}
}
})
answer.push(genre.index[0][1])
answer.push(genre.index[1][1])
} else {
answer.push(genre.index[0][1])
}
});
return answer;
}
console.log(solution(["classic", "pop", 'classic', 'classic', 'pop'], [500, 600, 150, 800, 2500])); // [4, 1, 3, 0]
출처: 프로그래머스
문제: https://programmers.co.kr/learn/courses/30/lessons/42579?language=javascript
문제 설명
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요. 제한사항
입출력 예입출력 예 설명 classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.
pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.
따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다. ※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다. |
'Algorithm Problem > JavaScript' 카테고리의 다른 글
[javascript] 프로그래머스 - 단어 변환 (0) | 2020.10.20 |
---|---|
[javascript] 프로그래머스 - 두 개 뽑아서 더하기 (2) | 2020.10.19 |
[JavaScript] 프로그래머스 - 프린터 (0) | 2020.07.28 |
[JavaScript] 프로그래머스 - 영어 끝말잇기(Summer/Winter Coding(~2018)) (0) | 2020.07.26 |
[JavaScript] 프로그래머스 - 기능개발 (0) | 2020.07.25 |