[programmers]完走しなかった選手
6857 ワード
完走していない選手-JavaScriptの説明
👉 Programmers問題リンク
論理1
2-1. 同じ名前がある場合は、参加者配列から名前を削除します.
function solution(participant, completion) {
// 완주자 배열에서 1명씩 이름을 꺼내 name_completion에 저장
for(let i = 0; i < completion.length; i++){
let name_completion = completion[i];
// name_completion을 참가자 배열의 모든 이름과 비교
for(let j = 0; j < participant.length; j++){
let name_participant = participant[j];
// 참가자 배열에 name_completion과 동일한 이름이 있을 경우 해당 이름을 배열에서 삭제
if(name_completion === name_participant){
participant.splice(j,1);
break;
}
}
}
return participant.pop(); // 참가자 배열에 남은 요소가 완주하지 못한 선수가 된다.
}
上記コードを実装することで所望の結果が得られるが、このコードは効率的に問題がある.完了者数に等しい繰返しを有する繰返し文には、
O(n^2)
の時間複雑度を有する参加者数に等しい繰返し文が存在する.与えられた問題では,参加可能な選手数の最大値は10万であり,n=10万であればn^2=100億であり,時間制限があれば正確な結果を出すことは難しい.(通常、計算時間の複雑度が1億であれば1秒かかる)
だから、別の方法を考える必要がある.
解題ロジック2
比較時間を最大限に短縮するために,与えられた配列を予め並べ替える方法を試みた.
sort()法を用いて
2-1. インデックス内の2つの配列の要素が異なる場合は、その要素が返されます.
次のコードに実装します.
function solution(participant, completion) {
var answer = '';
participant.sort();
completion.sort();
for(let i = 0; i < participant.length; i++){
if(participant[i] !== completion[i]){
return answer = participant[i]
}
}
}
上記のコードの時間的複雑さを実現するために、まずfor文を表示する.このfor文は参加者配列の長さだけを繰り返すため、O(n)の時間的複雑さを有する.問題はsort()メソッドの時間的複雑さであり,これは異なる言語で異なる実装があり,javascriptではO(nlogn)の複雑さがある.従って,このアルゴリズムの時間的複雑さはO(nlogn)
であった.nの最大値は10万であるため,底部が2のログに対して時間複雑度を計算するとnlognが166であるだけで前のプールの100億よりはるかに小さい値が得られる.したがって,このアルゴリズムは有効なアルゴリズムであると考えられる.
Reference
この問題について([programmers]完走しなかった選手), 我々は、より多くの情報をここで見つけました https://velog.io/@nomadhj/Programmers-완주하지-못한-선수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol