[プログラマー/Javascript]20完走していない選手
14400 ワード
問題の説明
多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前の並び
せいげんじょうけんマラソンに参加する選手は100000人以上である. 参加者の名前には、少なくとも20文字の小文字が含まれています. 参加者は同名である可能性がある. I/O例
participantcompletionreturn["leo", "kiki", "eden"]["eden", "kiki"]"leo"["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
に答える
初稿
*時間の複雑さ:問題解決に要する時間と入力した関数の関係で、「演算の回数」(実行回数)が計算されます.
調べてみると、
再送信された回答
単純で立派な草ですが、虚無の心の中で他にない草を探しています.この過程で何かを見つけたので、もう少し残したいです.
他人の解答
1
最初は
では、
3
では、
レビューを読んだり理解したりするのに時間がかかったので、コメントが長くなったような気がしますが、今は理解したような気がして、後で自分の頭を掻く自分のために詳しく書き始めました.
多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前の並び
participant
と完走した選手の名前の並びcompletion
を与える場合は、完走できない選手の名前を返すためにsolution
関数を作成してください.せいげんじょうけん
completion
の長さはparticipant
の長さ1より小さい.participantcompletionreturn["leo", "kiki", "eden"]["eden", "kiki"]"leo"["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
に答える
初稿
function solution(participant, completion) {
completion.forEach((a)=>{
participant.splice(participant.indexOf(a),1)
// participant내 a값의 인덱스 번호에서 부터 1개를 잘라낸다.
})
return participant[0]
}
.forEach()
のようにcompletion
を回転させ、participant
内の一致値を.splice()
に切り取る.そうなると同名の人がいても個々にカットするしかないので問題のない解答だと思い、コード実行でもうまくパスできました.しかし、コミット後にタイムアウトが見つかりました.*時間の複雑さ:問題解決に要する時間と入力した関数の関係で、「演算の回数」(実行回数)が計算されます.
調べてみると、
.forEach()
ゲートがこの問題を解決し、時間の複雑さが高く、タイムアウトが発生します.どうやって解くか分からないので、髪を束ねて、簡単な方法ができることに気づきました.再送信された回答
function solution(participant, completion) {
participant.sort()
completion.sort() // 두 배열 모두 사전순으로 정렬
for(let i = 0; i < participant.length; i++){
if(participant[i] !== completion[i]){
return participant[i] // 인덱스 순으로 비교하다 일치하지 않을 시 return
}
}
}
説明:participant
およびcompletion
の2つの配列は、いずれも辞書順に.sort()
に配列されている.その後、対応するインデックス間で比較を行うと、一致しないと返されます.単純で立派な草ですが、虚無の心の中で他にない草を探しています.この過程で何かを見つけたので、もう少し残したいです.
他人の解答
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
これはいったい何ですか.正規分布式ですか?どうして糸が解けますか.考えながらコメントを見ていると実はこの答えはvar solution=(participant,completion)=>participant.find(name=>!completion[name]--,completion.map(name=>completion[name]=(completion[name]|0)+1))
このコードの変数名はminifyです.しかしこのように見ても理解できないことが多く、ちょうどコメントに親切な解釈(?)誰かがこの本を書いたので、内容を整理したいです.1
最初は
participant.find(콜백함수,콜백함수에 this로 사용될 객체)
の2つのパラメータで、後の関数はコールバック関数より先に実行されます.ここでコールバック関数が果たす役割を見てみると、実際には、元の.map()
は通常、現在処理する要素をパラメータとして受け入れ、コールバック関数を順番に実行して新しい配列を返すが、実際にはここから返される配列には特に意味はない.さらに重要なのは、.map()
関数が最初に実行されることです.つまり、読みやすさの良い方法で前に抜き出して整理するなら、var solution = (participant,completion) => {
completion.map(name => completion[name] = (completion[name]|0)+1)
return participant.find((name) => !completion[name]--)
}
2では、
.map()
のキャラクターを見てみましょう.ここで、name
はcompletion
の各要素を表し、completion[name]
(=
)を定義することによって疑問が生じる.completion[name]=
「このようにキー割り当て値は辞書で行われ、completion
は配列ですが、これはどのようにして行われますか?レビューを読んで一番不思議なのはこの部分ですが、実はJavaScriptの並びが対象です.実際には、配列をtypeof
と確認すると、'object'
が表示されます.したがって、dictionaryに示すようにkeyを定義してvalueを割り当てることで、配列にも以下の内容が含まれていることがわかります.let fruit = ['apple','grape','banana']
console.log(typeof fruit) // 'object'
fruit['apple'] = 3
console.log(fruit) // ['apple','grape','banana', apple: 3]
したがって、上記のcompletion[name] = (completion[name]|0)+1
は、completion
オブジェクトのうちname
というkeyのvalueを定義しており、completion
オブジェクトの中にname
というkeyのvalueが既に存在していれば、その値がなければ0を吐き出し(OR文)、さらに1を加えたものと理解できる..map()
が回転した後、completion
で操作を完了し、前はString、後ろはkey-valueペアである.3
では、
.find()
を見てみましょう.まず、.find()
は、条件の中でtrue
の最初の要素return
である.では、どのような場合true
でしょうか.completion[name]
は、その名前の個数を取得します.でもここに!後の値を「boolean」に変更します.逆も同様です.!true
面false
が表示されます.すなわち、valueが1
であれば!1
である.逆に、false
は!0
である.JavaScriptでは、true
の値が7つあります(false
、false
、0
、-0
、NaN
、null
、undefined
):だからtrueになります.次に--
,削減1を「後置」とする.この場合、completion[name]
の値は1
または0
であり、undefined
は1
の後にfalse
が削除され、同名1
が発生すると0
が削除される.元のtrue
に値が存在しない場合、completion
が現れても、その値はundefined
になり、最終的にキー値が返されます.余談true
に接尾辞を付けると、キーと値が生成され、valueはundefined
で並べられます.let fruit = ['apple','grape','banana']
console.log(!1) // false
console.log(!0) // true
!fruit['banana']--
console.log(fruit) // ['apple','grape','banana', banana: NaN]
の最後の部分レビューを読んだり理解したりするのに時間がかかったので、コメントが長くなったような気がしますが、今は理解したような気がして、後で自分の頭を掻く自分のために詳しく書き始めました.
Reference
この問題について([プログラマー/Javascript]20完走していない選手), 我々は、より多くの情報をここで見つけました https://velog.io/@ricky0813/프로그래머스Javascript-20.-완주하지-못한-선수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol