[プログラマー]ベストアルバム(ハッシュ)/javascript


解題方法


異なるタイプによって最も多く再生される2曲を組み合わせることに集中します.

  • もしそうであれば,まず全再生回数の和を異なる種類に応じて保存し,次に再生回数に応じて降順にソートするプロセスが必要である.
    例えば、[{pop:3100},{classic:1450}]

  • 固有の番号、タイプ、再生回数をまとめたオブジェクトが必要です.
    ex)
  • [
      { genre: 'classic', index: 0, playCnt: 500 },
      { genre: 'pop', index: 1, playCnt: 600 },
      { genre: 'classic', index: 2, playCnt: 150 },
      { genre: 'classic', index: 3, playCnt: 800 },
      { genre: 'pop', index: 4, playCnt: 2500 }
    ]
    
  • 2番配列では、1番配列オブジェクトのキー値に対応するタイプを配列に格納し、再生回数ごとに降順にソートし、最初の2つの要素の固有番号のみを抽出して答え配列にプッシュします.
  • 完全なコード


    コメントを参照して理解してください:)
    function solution(genres, plays) {
        
        let answer = [];
      
        // 1번 과정
        let playCntByGenre={}
        for(let i=0;i<genres.length;i++){
            playCntByGenre[genres[i]]=playCntByGenre[genres[i]] ? playCntByGenre[genres[i]]+plays[i] : plays[i]
        }
        // 여기서 playCntByGenre는 {classic:1450,pop:3100} 형태
      
        // 재생횟수로 내림차순 정렬하기 위해, [키,밸류]의 배열 형태로 만들어준다
        let keyValueArr=Object.entries(playCntByGenre)
        keyValueArr.sort((a,b)=>b[1]-a[1]);
        // 정렬함수의 compareFunc 작성시, return 값이 양수면 앞뒤순서가 바뀐다는 점을 기억하면 쉽다!
      
        // 여기서 keyValueArr는 [ [ 'pop', 3100 ], [ 'classic', 1450 ] ] 형태
        
        // 2번 과정
        let allInfoObj=genres.map((g,i)=>({
            genre:g,
            index:i,
            playCnt:plays[i]
        })) 
        
        // 3번 과정
        keyValueArr.forEach((k,i)=>{
            let current=[];
            for(let j=0;j<allInfoObj.length;j++){
                if(k[0]===allInfoObj[j].genre){
                    current.push(allInfoObj[j]);
                }
            }
            current.sort((a,b)=>b.playCnt-a.playCnt);
            current.forEach((c,i)=>{
                if(i<2){
                 // 2개만 뽑아야 하기 때문에 index가 2보다 작을때까지만 answer.push 수행
                answer.push(c.index)
                }        
            })
        })
        
        return answer;
    }

    三級にとって、簡単な問題のようです.🤓