推奨CK 008|職業群(javascript)



質問する


🔗 Weekly Challenge第4週|推薦職業群
開発者が使用する言語と言語の好みを入力すると、対応する職業群を推奨するアルゴリズムを開発します.
次の表に、5つの共通言語(5つの職業ごと)の職業言語スコアを示します.
...
パラメータは、職業群の言語スコアを整理した文字列テーブル、開発者が使用する言語を含む文字列配列言語、および言語の好みを持つ整数配列プリファレンスを含む文字列配列言語プリファレンスです.開発者が使用する言語嗜好度x職業群言語点数の総和が最も高い職業群は、解関数を完了してください.複数の職業群の合計が同じ場合は、名前の辞書順に最速の職業群を返します.

せいげんじょうけん

  • tableの長さ=5
  • tableの要素は、「職業群5点言語4点言語3点言語2点言語1点言語」形式の文字列です.職業群、5分言語、4言語、3分言語、2分言語、1分言語は1つのスペースです.
  • tableは、すべてのテストケースで同じです.
  • 1≦言語長≦9
  • languageの要素は、「JAVA」、「JAVA SCRIPT」、「C」、「C++」、「C#」、「SQL」、「Python」、「KOTLIN」、「PHP」の1つ以上を含む.
  • 言語の要素は重複しません.
  • preferenceの長さ=言語の長さ
  • 1≦preferenceの要素≦10
  • preferenceのi要素は言語のi要素の言語の好みである.
  • 返す文字列には、SI、CONTENTS、HARDWARE、PORTAL、およびGAMEが含まれます.
  • 私が書いたコード

    function solution(table, languages, preference) {
        var answer = ''
        let result = {}
        table = table.map(v => v.split(" "))
        preference = languages.map((e,i) => {
            return [e, preference[i]]
        })
        var pref = {}
        
        preference.map((v) => {
            pref[v[0]] = v[1]
        })
        
        table.forEach((column) => {
            let scores = []
            for(let i=1; i < column.length; i++) {
                if(languages.includes(column[i])) {
                    scores.push((column.length - i) * pref[column[i]])
                }
            }
            result[column[0]] = scores.reduce((sum, cv) => {
                return sum + cv
            }, 0)
            
        })
        var sortedResult = {}
            Object.keys(result).sort().forEach((key)=> {
                sortedResult[key] = result[key]
            })
        
        let max = Math.max(...Object.values(sortedResult))
        return getKeyByValue(sortedResult, max)
        
    }
    
    function getKeyByValue(object, value) {
      return Object.keys(object).find(key => object[key] === value);
    }
    
    前に解いた問題では,単語を習うが適用された.
  • まず配列中のstringで区切られた部分をsplitに分割する.
  • table = table.map(v => v.split(" "))
    
  • 개발자가 선호하는 언어:언어 선호도生成対象
  • var pref = {}
    preference.map((v) => {
      pref[v[0]] = v[1]
    })
  • スコアを計算し、언어:언어 선호도*직업군 언어 점수としてresultオブジェクトに含めます.
  • table.forEach((column) => {
      let scores = []
      for(let i=1; i < column.length; i++) {
        if(languages.includes(column[i])) {
          scores.push((column.length - i) * pref[column[i]])
        }
      }
      result[column[0]] = scores.reduce((sum, cv) => {
        return sum + cv
      }, 0)
    
    })
    
  • 辞書順に並べ替えます.
  • (既存のオブジェクトにどのように位置合わせするか分からないため、位置合わせされたオブジェクトを含む新しい配列が作成されました.)🥲)
    var sortedResult = {}
    Object.keys(result).sort().forEach((key)=> {
      sortedResult[key] = result[key]
    })
  • 関数を使用してオブジェクト値の最大値を検索し、その値をオブジェクト値としてキーを検索します.
  • let max = Math.max(...Object.values(sortedResult))
    
    return getKeyByValue(sortedResult, max)
    
    function getKeyByValue(object, value) {
      return Object.keys(object).find(key => object[key] === value);
    }

    他人の解答

    function solution(table, languages, preference) {
      return table.map((r) => r.split(' '))
        .map((t) => [...t.splice(0, 1), t])
        .map(([t, arr]) => [t,
                            languages.reduce((acc, l, i)=> {
                              acc += (5 - (arr.indexOf(l) === -1 ? 5 : arr.indexOf(l)))
                                * preference[i];
                              return acc;
                            }, 0)])
        .sort((a, b) => b[1] - a[1] - (a[0] < b[0]))[0][0]
    }
    function solution(table, languages, preference) {
        var answer = '', max = 0;
    
        table.forEach(row => {
            const [category, ...ranks] = row.split(' ');
            let sum = 0;
            for(let i=0; i<languages.length; i++) {
                const rank = ranks.findIndex(lang => lang === languages[i]);
                if(rank === -1) continue;
                sum += (ranks.length - rank) * preference[i];
            }
    
            if(max < sum) {
                max = sum;
                answer = category;
            } else if(max === sum) {
                answer = [answer, category].sort()[0];
            }
        });
    
        return answer;
    }
    3週目の車は触ることすらできませんでしたが、事前に学習グループのメンバーが4週目の車が運転できるようだと言っていたので、1回運転しました.2時間ほどかかりましたが...
    どこに置いても恥ずかしい...私のコードですが、発展の気持ちでcodekataを書きます!私もいつかたくさんのいいねを受け取るでしょう.その日まで勉強に励む:)