[プログラマー]フルコースを完走しなかった選手(ハッシュLEVEL 1)

9662 ワード

プログラマーはWeeklyの問題がないので、符号化テストの高得点Kitの問題をすることにしました.その中で最初のハシュから!

質問する


多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前と完走した選手の名前の並びが完成したら、完走していない選手の名前を返す解決関数を書いてください.

せいげんじょうけん


マラソンに出場する選手は1人以上10万人以下だ.
完了長さは参加者の長さ1より小さい.
参加者の名前には、少なくとも1つまたは20個の小文字が含まれています.
参加者は同名であってもよい.

I/O例

participant	completion	return
[“leo”, “kiki”, “eden”]	[“eden”, “kiki”]	“leo”
[“marina”, “josipa”, “nikola”, “vinko”, “filipa”]	[“josipa”, “filipa”, “marina”, “nikola”]	“vinko”
[“mislav”, “stanko”, “mislav”, “ana”]	[“stanko”, “ana”, “mislav”]	“mislav”

私の答え


最初は参加者と完走者の名前を逐一比較した.また,同じ名前があれば参加者リストから削除する.
重複する名前が存在する可能性があるため、差分セットとして検索するのではなく、1~3でテストを比較することを選択しましたが、for文はmapに移動してタイムアウトしました.同じ名前が見つかるまで、すべての配列を巡回する必要がある場合があります.今から見れば効率も低い.😭
function solution(participant, completion) {
  let length = participant.length;
        
  for(let i = 0;  i<length; i++){
    participant.map((person, idx)=>{ 
      if(person.includes(completion[i])) {
        return  participant.splice(idx,1)
        }
      })
    }
  return participant[0]
}
今回は選手の名前を比較するために、選手が最後まで並ばないように、まず参加者と完走者のリストをsort()に並べました.順位をつけて選手名を比較すると、1つずつ並べた値を比較すればいいのですが、選手名が違うとその選手は完走していない選手なので、引き返せばいいのです.👍🏻
function solution(participant, completion) {
    participant.sort();
    completion.sort();

      for (let i = 0; i < participant.length; i++){
        if(participant[i] !== completion[i]){
          return participant[i]
        } 
      }
  }

人の怒りを晴らす


Map()の属性を用いて解いた.これらの接着剤を一つ一つ分解して本当に多くのことを学びました...👍🏻
参加者は新しく作成されたマッピングにあります.lengthを押してkey-value値を設定します.
参加者[i]と完了[i]を一意のキー値としてマッピングします.get(key)は値として使用されます.
参加者[i]の設定と[i]の完了時のマッピング.get(key)などのデータオーバーライドの特性を用いて,+−に値を加えた.
完成した選手は0を値とし、未完成の選手は1を値とする.
mapをfor of文にループし、0より大きい値を返します.
function solution(participant, completion) {
    const map = new Map();


    for(let i = 0; i < participant.length; i++) {
        let a = participant[i], 
            b = completion[i];

        map.set(a, (map.get(a) || 0) + 1); // 중복되는 이름은 +1씩 늘어남
        map.set(b, (map.get(b) || 0) - 1); // participant와completion 명단 모두에 이름이 있으면 -1됨. 
    }

    for(let [k, v] of map) {
        if(v > 0) return k;
    }

    return 'nothing';
}