プログラマー-ベストアルバム
2612 ワード
1.質問
質問リンク
2.解答
2-1. 条件
2-2. に答える
逐次漸進的に実施しましょう.
まず音楽をジャンル別に再生時間と音楽の種類を保存します
const agg = genres.reduce((m, genre, index) => {
m[genre] = m[genre] || { playtime: 0, music: [] };
m[genre].playtime += plays[index]; // 플레이 시간 누적
m[genre].music.push([index, plays[index]]); // 어떤 음악이 있는지 기록(인덱스와 플레이 시간)
return m;
}, {});
// 가공 후의 agg의 모습
agg = {
rock: {
playtime: 200
music: [[0, 100], [2, 100]]
},
pop: {
playtime: 500,
music: [[1, 100], [3, 200], [4, 300]]
}
}
次にplaytimeに基づいてaggを降順に並べ替えます.(2号適合条件)const sort = Object.values(agg).sort((a, b) => b.playtime - a.playtime)
// 정렬 후 sort의 모습
sort = [{ playtime: 500, music: [[1, 100], [3, 200], [4, 300]] }, { playtime: 200, music: [[0, 100], [2, 100]] }
音楽の再生時間を基準に、再生時間の降順に並べ、タイプ別に2つ選べばいいようになりました.再生時間が同じでも、固有番号の低い音楽を先に選ぶことができるので、並ぶ必要はありません.
(1号条件、3号条件、4号条件が満たされる)
const album = sort.reduce((m, genre) => {
// 플레이 시간 기준으로 내림차순 정렬
genre.music.sort((a, b) => b[1] - a[1]);
// 두 개씩 모으기
return m = m.concat(genre.music.slice(0, 2).map(v => v[0]));
}, []);
整理してから.1.音楽をジャンル別に分類し、再生時間と音楽の種類を保存する.
2.playtimeに基づいて保存されたセットを降順にソートします.
3.配列された集合では、再生時間降順にmusicを配列し、2つずつ抽出する.
3.完全なコード
function solution(genres, plays) {
// 1. 음악들을 장르별로 묶어서 플레이 시간과 어떤 음악들이 있는지 저장합니다.
return Object.values(genres.reduce((m, genre, index) => {
m[genre] = m[genre] || { playtime: 0, music: [] };
m[genre].playtime += plays[index];
m[genre].music.push([index, plays[index]]);
return m;
}, {}))
// 2. 저장한 집합을 playtime을 기준으로 내림차순 정렬을 합니다.
.sort((a, b) => b.playtime - a.playtime)
// 3. 정렬한 집합에서 music을 플레이 시간 기준으로 내림차순 정렬해서 두 개씩 뽑아냅니다.
.reduce((m, genre) => {
genre.music.sort((a, b) => b[1] - a[1]);
return m = m.concat(genre.music.slice(0, 2).map(v => v[0]));
}, []);
}
Reference
この問題について(プログラマー-ベストアルバム), 我々は、より多くの情報をここで見つけました https://velog.io/@front/프로그래머스-배스트앨범テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol