完走していない選手(1)


問題の説明


多くのマラソン選手がマラソンに参加した.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"

I/O例説明


例1
「leo」は参加者名簿に載っているが、フルコースを走る者名簿には載っていないため、フルコースを完走できなかった.
例2
「vinko」は参加者名簿に載っていたが、完走者名簿に載っていなかったため完走できなかった.
例#3
「誤導」は参加者リストに2人いたが、完走者リストには1人しかいなかったため、1人は完走しなかった.

結果

function solution(participant, completion) {
    var sp=participant.sort();
    var sc=completion.sort();
    for(i=0;i<participant.length;i++){
    if(sp[i]!=sc[i]){
        var answer=sp[i]
        break
    }
}
    return answer;
}

プロセス


n/a.計画

  • は、2つの配列の重複値
  • を検索する.
  • 重複値
  • をアレイから削除する.
    戻り値

  • 1.2つの配列の重複値の検索


    match、concat、filter、map関数のいずれかを使用できます.
    //[배운점 정리 참고] 간단히 participant와 completion배열중 같은 중복값만 찾는 코드
    var part=['leo','kiki']
    var com = ['leo']
    var same = part.map(function(ma){
        if(part==com){return part}
    })
                        
    var result=part.filter(part=>part==com);
    
    result
    ["leo"]
    
    
    //중복되지 않은 값을 리턴하는 코드
    var result2=part.filter(part=>part!=com)
    
    result2
    ["kiki"]
    
    エラー:順序が異なると重複値が見つからない場合があります.
    function solution(participant, completion) {
        
        var answer = participant.filter(participant=>participant!=completion);
        return answer;
    }
    
    입력값 〉	["leo", "kiki", "eden"], ["eden", "kiki"]
    기댓값 〉	"leo"
    실행 결과 〉	실행한 결괏값 ["leo","kiki","eden"]() 기댓값 "leo"() 다릅니다.
    つまり,順序が異なっていても値ごとに比較することができる.
    これらの値を同じソートする必要があります.
    しかし,sort()と並べ替えても結果は同じである.

    2.2つの配列の差セットを検索

    //참가했고 완주한 선수
    var participant =["leo", "kiki", "eden"]
    
    var completion=["eden", "kiki"]
    
    var intersection=participant.filter(x=>completion.includes(x))
    //completion에 포함되어 있는 원소들만 participant 배열에서 골라 반환한다.
    
    intersection
    (2) ["kiki", "eden"]
    
    //참가했으나 완주는 못한 선수
    var difference=participant.filter(x=>!completion.includes(x))
    //completion에 포함되어 있지 않은 원소를 participant배열에서 골라 반환한다.
    
    difference
    ["leo"]

    3.同名の人

    //동명이인이 있는 경우 참가/완주 모두 한 선수
    var participant=["mislav", "stanko", "mislav", "ana"]
    var completion=["stanko", "ana", "mislav"]
    var intersection=participant.filter(x=>completion.includes(x))
    var difference=participant.filter(x=>!completion.includes(x))
    
    intersection
    (4) ["mislav", "stanko", "mislav", "ana"]
    //mislav가 하나만 반환되어야 한다.
    
    Array.from(new Set(intersection))
    (3) ["mislav", "stanko", "ana"]
    
    
    difference
    []
  • フルコースに出場/完走した選手は、2名とも返却される.
  • に出場したが、完走しなかった選手は返還されない.
  • 同じ名前の人のうち1人だけが返却されていれば大丈夫です.
    (完走していない選手は誰か区別がつかない)
    すなわち,sort()と並べ替えて同じ要素が連続して現れる場合,splice()でそのうちの1つを削除するのが最も簡単である可能性がある.
    intersection.sort()
    (4) ["ana", "mislav", "mislav", "stanko"]
    
    for(i=0;i<intersection.length;i++){
        if(intersection[i]==intersection[i+1]){
            intersection.splice(i,1)}
    }
    
    intersection
    (3) ["ana", "mislav", "stanko"]
    
    
    上記の場合、サブセットの要素はありません.完走しなかった選手は誤導で、出場と完走した選手の名前も誤導なので同じ名前で処理します.
    この場合、重複値を見つけて正解に戻ってはどうですか?
    if(difference.length==0){
      var si = intersection.sort()
    
    
    for(i=0;i<intersection.length;i++){
        if(si[i]==si[i+1]){
            var answer=si.slice(i,i+1)}
    }
    }
    answer
    ["mislav"]
    片付けてください.
    function solution(participant, completion) {
    	var intersection=participant.filter(x=>completion.includes(x))
    	var difference=participant.filter(x=>!completion.includes(x))
        if(difference.length==0){
            var si = intersection.sort()
    
    
            for(i=0;i<intersection.length;i++){
               if(si[i]==si[i+1]){
               var answer=si.slice(i,i+1)}
    }
    }
        else{
            var answer=difference
        }
    
        return answer;
    }
    
    solution(["leo", "kiki", "eden"],["eden", "kiki"])
    ["leo"]
    solution(["marina", "josipa", "nikola", "vinko", "filipa"],["josipa", "filipa", "marina", "nikola"])
    ["vinko"]
    solution(["mislav", "stanko", "mislav", "ana"],["stanko", "ana", "mislav"])
    ["mislav"]
    コンソールウィンドウで正しい出力で、プログラマではエラーです.
    結果はfor文でいちいち比較する方法しかありませんか?

    文脈

    function solution(participant, completion) {
    	for (i=0;i<participant.length;i++){
        for(j=0;j<length;j++){
            if(participant[i]==completion[j]){
                participant.splice(i,1)
                var answer=participant
                }
                    if(participant[0]==participant[1]){
                        participant.pop();
                        var answer = participant               
                        }
        
    }
    }
        return answer;
    }

    sort+for文

    //예시 1
    var participant = ["marina", "josipa", "nikola", "vinko", "filipa"]
    var pl=participant.length;
    var completion=["josipa", "filipa", "marina", "nikola"]
    
    var sp=participant.sort();
    var sc=completion.sort();
    console.log(sp)
    console.log(sc)
    for(i=0;i<pl;i++){
       if(sp[i]!=sc[i]){
    console.log('index'+i+',',answer);
       break
        }
    
    
    
    }
    VM3373:7 (5) ["filipa", "josipa", "marina", "nikola", "vinko"]
    VM3373:8 (4) ["filipa", "josipa", "marina", "nikola"]
    VM3373:11 index4, vinko
    
    
    
    //예시2
    var participant = ["leo", "kiki", "eden"]
    var pl=participant.length;
    var completion=["eden", "kiki"]
    var cp=[];
    var sp=participant.sort();
    var sc=completion.sort();
    console.log(sp)
    console.log(sc)
    for(i=0;i<pl;i++){
       if(sp[i]!=sc[i]){
    var answer=sp[i]
    console.log('index'+i+',',answer);
       break
        }
    
    
    
    }
    VM3414:7 (3) ["eden", "kiki", "leo"]
    VM3414:8 (2) ["eden", "kiki"]
    VM3414:12 index2, leo
    
    
    
    //동명이인
    var participant = ["mislav", "stanko", "mislav", "ana"]
    var pl=participant.length;
    var completion=["stanko", "ana", "mislav"]
    var cp=[];
    var sp=participant.sort();
    var sc=completion.sort();
    console.log(sp)
    console.log(sc)
    for(i=0;i<pl;i++){
       if(sp[i]!=sc[i]){
    var answer=sp[i]
    console.log('index'+i+',',answer);
       break
        }
    
    
    
    }
    VM3419:7 (4) ["ana", "mislav", "mislav", "stanko"]
    VM3419:8 (3) ["ana", "mislav", "stanko"]
    VM3419:12 index2, mislav
    これをもとに答えを書きましょう
    function solution(participant, completion) {
        var sp=participant.sort();
        var sc=completion.sort();
        for(i=0;i<participant.length;i++){
        if(sp[i]!=sc[i]){
            var answer=sp[i]
            break
        }
    }
        return answer;
    }

    いったい...難しい問題ではないようですが、ずっと曲がりくねっています.
    その過程でたくさん勉強しましたが!

    Review


    filter()


    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
    filter()メソッドは、所与の関数でテストされたすべての要素を新しい配列に収集します.
    すなわち,特定の条件を満たす配列のすべての値を配列形式で返す.
    //예시
    const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
    
    const result = words.filter(word => word.length > 6);
    
    console.log(result);
    // expected output: Array ["exuberant", "destruction", "present"]
    
    
    //예시2
    function isBigEnough(value) {
      return value >= 10;
    }
    
    var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
    // filtered 는 [12, 130, 44]
    以前に作成した10個のプライマリアレイ関数を参照してください。
    
    // Q6. make an array of enrolled students
    {
        const result = students.filter((student) => student.enrolled);
    //==>:aero function:각각의 학생이 전달이되면, 등록되었는지 확인하고, 등록된 학생들만 출력한다
    }
    
    
    
    
    
    ### map()
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map
    map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다
    
    ```jsx
    var numbers = [1, 4, 9];
    var doubles = numbers.map(function(num) {
      return num * 2;
    });
    // doubles는 이제 [2, 8, 18]
    // numbers는 그대로 [1, 4, 9].

    includes()


    include()関数は、配列に特定の値が含まれているかどうかをブール値に返します.
    出典:https://hohoya33.tistory.com/134[開発コメント]

    reduce()


    https://brunch.co.kr/@swimjiy/15
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
    Array.include(value):valueがArray配列に存在するかどうかを判断し、true、falseを返します.
    let arr = [3, 1, 3, 5, 2, 4, 4, 4];
    arr.reduce((acc,curr) => acc.includes(curr) ? acc : [...acc,curr],[]); 
    // [2, 1, 5, 6, 3]
    
    
    출처: https://hohoya33.tistory.com/132 [개발 메모장]
    //배열의 중복 항목 제거
    참고: Set과 Array.from()을 사용할 수 있는 환경이라면, let orderedArray = Array.from(new Set(myArray));를 사용해 중복 요소를 제거할 수도 있습니다.
    
    let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
    let result = arr.sort().reduce((accumulator, current) => {
        const length = accumulator.length
        if (length === 0 || accumulator[length - 1] !== current) {
            accumulator.push(current);
        }
        return accumulator;
    }, []);
    console.log(result); //[1,2,3,4,5]

    2つのアレイの重複除外方法を参照してください。


    https://hianna.tistory.com/422
    https://hohoya33.tistory.com/134
    배열 교집합
    
    filter와 includes을 사용하여 두 배열에 포함된 동일한 요소를 확인 할 수 있습니다.
    
    includes() 함수는 배열이 특정값을 포함하고 있는지의 여부를 boolean 값으로 반환합니다.
    
    let arrA = [1, 4, 3, 2];
    let arrB = [5, 2, 6, 7, 1];
    
    arrA.filter(it => arrB.includes(it)); // returns [1, 2]
    
    
    출처: https://hohoya33.tistory.com/134 [개발 메모장]

    Set


    set(data object)を使用してアレイ内の重複値を除去する(一意の値のみ保持)

    splice

    array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
    

    パラメータ


    start:配列のインデックスの変更を開始するには
    deleteCount(オプション):アレイから削除する要素の数
    item1, item2, ... (オプション):アレイに追加する要素

    交差


    https://stackoverflow.com/questions/1187518/how-to-get-the-difference-between-two-arrays-in-javascript

    sort-ソート


    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
    arr.sort([compareFunction])

    パラメータ


    比較機能(Optional):ソート順の定義
    省略すると、配列は各要素の文字列に基づいて変換され、各文字のUnicodeコードポイント値に基づいてソートされます.*円配列が整列しています.新しいシナリオは作成されません.
    他の接着剤を一つ一つ分解して勉強しましょう.
    https://muhly.tistory.com/58
    1.for文で一つ一つ比較(そうはしたくない...別の方法を探したい)
    2.hashを使う(勉強しよう!!)