[プログラマー]ベストアルバムJavascript

42856 ワード

質問の表示

🔒 質問する



🔐 ソリューション

  • タイプソート
  • タイプをキーとし、歌曲配列を値とするハッシュ値
  • を生成する.
  • のジャンル順に従って、そのジャンルの曲配列において大きな値を求め、シナリオにおいてindexof()を見つけ、結果としてpush
  • を配列する.

    🔓 プール(2 h)


    初めての試み

    function solution(genres, plays) {
      	// 장르 순서 정하기
        let sorted_plays = plays.slice();
        sorted_plays.sort((a,b) => a-b);
        let order = [];
        while(sorted_plays.length){
            let idx = plays.indexOf(sorted_plays.pop());
            if(!order.includes(genres[idx]))
                order.push(genres[idx]);
        }
        
      	// 장르를 키, 노래 배열을 값으로 가지는 객체 생성
        let lists = new Map();
        for(let i=0; i<plays.length; i++){
            if(!lists.has(genres[i])){
                lists.set(genres[i], [plays[i]]);
            } else {
                let pre = lists.get(genres[i]);
                pre.push(plays[i]);
                lists.set(genres[i], pre);
            }
        }
        
      	// 장르 중 최대 재생횟수를 가진 두 노래의 인덱스 찾기
        let result = [];
        order.forEach(x => {
            let musics = lists.get(x).sort((a,b) => b-a);
            let top2 = musics.splice(0,2);
            result.push(...top2.map(x => plays.indexOf(x)));
        })
        return result
    }
    /*
    	채점결과 : 20.0 / 100.0
    */
    最も多く再生される2曲のインデックスを探していると,再生回数が一致すればインデックスを取得できることに気づいた.💦

    二次試行

    function solution(genres, plays) {
        let sorted_plays = plays.slice();
        sorted_plays.sort((a,b) => a-b);
        let order = [];
        while(sorted_plays.length){
            let idx = plays.indexOf(sorted_plays.pop());
            if(!order.includes(genres[idx]))
                order.push(genres[idx]);
        }
        
        let lists = new Map();
        for(let i=0; i<plays.length; i++){
            if(!lists.has(genres[i])){
                lists.set(genres[i], [plays[i]]);
            } else {
                let pre = lists.get(genres[i]);
                pre.push(plays[i]);
                lists.set(genres[i], pre);
            }
        }
        
      	// 장르와 재생횟수를 고려하면서, 결과 배열에 포함되어 있는지 확인
        let result = [];
        order.forEach(x => {
            let musics = lists.get(x).sort((a,b) => b-a);
            let top2 = musics.splice(0,2);
            top2.forEach(t => {
                for(let i=0; i<plays.length; i++){
                    if(genres[i] === x && plays[i] === t && !result.includes(i)){
                        result.push(i);
                        break;
                    }
                }
            })
        })
        return result;
    }
    /*
    	채점결과 : 33.3 / 100.0
    */
    ほほほ、ここまで来て、私は問題を理解していないと思って、だから私はまたよく読んで、歌を収録する基準が1番ではないことを発見して、🥲

    3回目の試み

    function solution(genres, plays) {
      	// 장르의 순서를 누적 횟수 기준으로 변경
        let order = new Map();
        let lists = new Map();
        for(let i=0; i<plays.length; i++){
            if(!lists.has(genres[i])){
                lists.set(genres[i], [plays[i]]);
                order.set(genres[i], plays[i]);
            } else {
                let pre = lists.get(genres[i]);
                pre.push(plays[i]);
                lists.set(genres[i], pre);
                order.set(genres[i], order.get(genres[i]) + plays[i]);
            }
        }
    	// 재생횟수를 내림차순으로 정렬한 뒤 장르만 추출
        let tmp = [...order.entries()].sort((a,b) => b[1]-a[1]);
        order = tmp.map(x => x[0]);
        
        let result = [];
        order.forEach(x => {
            let musics = lists.get(x).sort((a,b) => b-a);
            let top2 = musics.splice(0,2);
            top2.forEach(t => {
                for(let i=0; i<plays.length; i++){
                    if(genres[i] === x && plays[i] === t && !result.includes(i)){
                        result.push(i);
                        break;
                    }
                }
            })
        })
        return result;
    }

    成功!

    🔁 feedback


    問題の条件をよく読んで意味を理解する

    +他人の回答

    function solution(genres, plays) {
      	
        var dic = {};
        genres.forEach((t,i)=> {
            dic[t] = dic[t] ?  dic[t] + plays[i] :plays[i];        
        });
    	
        var dupDic = {};
        return genres          
              .map((t,i)=> ({genre : t, count:plays[i] , index:i}))
              .sort((a,b)=>{               
                   if(a.genre !== b.genre) return dic[b.genre] - dic[a.genre];
                   if(a.count !== b.count) return b.count - a.count;
                   return a.index - b.index;
               })
               .filter(t=>  {
                   if(dupDic[t.genre] >= 2) return false;
                   dupDic[t.genre] = dupDic[t.genre] ? dupDic[t.genre]+ 1 : 1;
                   return true;
                })
               .map(t=> t.index);  
    }
  • dicでは、再生回数を累積してタイプを決定する順序とする.
  • タイプ、再生回数、インデックスを1つのオブジェクトとします.
  • ジャンルの順で、1曲の再生回数、インデックスを基準に多重分類を行う.
  • dupdicでは,ジャンルの曲数が2以上であれば,以降の曲は除外する.
  • function solution(genres, plays) {
        const count = {};
        let answer = [];
        const acc = genres.reduce((a, c, i) => {
            debugger;
            count[c] ? count[c].push([i, plays[i]]) : count[c] = [[i, plays[i]]];
            return a.set(c, a.get(c) ? a.get(c) + plays[i] : plays[i]), a;
        }, new Map());
    
        [...acc].sort((a, b) => b[1] - a[1]).map(v => {
                answer = answer.concat(count[v[0]].sort((c, d)=>d[1]-c[1]).slice(0,2));
        });
        return answer.map(v=>v[0]);
    }
  • countオブジェクトでは、曲のインデックスと再生回数の配列に従って塗りつぶされます.
  • タイプをキーとし、再生回数を値とするaccオブジェクトを生成します.
  • accでは、再生回数を基準に降順に並び、ジャンルごとに該当する曲のリストを選択し、降順に並べて2曲を選択する.