プログラマー-ベストアルバム


1.質問


質問リンク


2.解答


2-1. 条件

  • タイプによると、最も多くの曲が2曲集められている.
  • まずは
  • でたくさんの曲が流れたジャンルを収録.
  • まずは
  • ジャンル内で多くの曲が流れている.
  • ジャンル内で同じ再生回数の曲には、まず固有番号の低い曲が収録される.
  • 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]));
            }, []);
    }