[TIL]航海99日目

3589 ワード

アルゴリズム株


今日の主な内容はhash、正規表現かもしれません!
ㅠㅠしかし今日问题を解く时あまりに崩壊しました...私だけではできないようですが、あまりにも口を開けているので、時間がかかりますが、効率的ではありません...ううう
答えはもっと解くべきでしょう.
資料の構造を勉強して、もっと解いてください.1時間弱なら必ず答えを見て!

1. Hash


説明すると,これは人名値をキーとし,その値に1を加える方式で実現される問題である.(後にもう一度forを回し、-1後に残り1のキー値は未完成選手)
これは後で使うのに適しているのは知っていますが、hashが何なのか分かりません.
だからhashについて知りたいです.
1)Hashの定義
ハッシュ関数は、任意の長さを有する任意のデータを固定長データにマッピングする関数である.このとき,この関数が吐き出す結果をハッシュ(Hash)と呼ぶ.
ハッシュによって送信されるため,ハッシュのみを見てどのような値が得られたかをパラメータで推測することは困難である.
[注釈とソース]https://evan-moon.github.io/2019/06/25/hashtable-with-js/
  • ハッシュ表
    ハッシュ・テーブルは、ハッシュ関数を使用してキー値にインデックスを割り当て、インデックスの値にデータを格納するデータ構造です.ハッシュデータとは、一対のキーと値からなるデータ
  • を指す.
    ソース:https://overcome-the-limits.tistory.com/entry/データ構造-ハッシュ・テーブル-with-JavaScript[Plus Ultra]
    今見ました...難しすぎる気がする.コードで理解するのが早いかもしれません.問題では、インデックスをキー値に格納し、valueにデータを格納してみました.
    hashを使う問題(フルコースを走っていない選手)
    function solutionHash(participant, completion) {
    let hashed = []
    participant.forEach((entry) => {
      // 사람 이름을 key 값으로 배열에 저장한다.
      // 그리고 그 사람이름이 만약에 배열에 이미 있으면 1을 더해주고
      // 아니면 그냥 1
      // 그러면 사람 모두가 1이상의 수를 가지게 된다 (동명이인이면 2이상)
      hashed[entry] = hashed[entry] ? hashed[entry] + 1 : 1
    })
    // completion을 돌면서
    // hashed key값을 돌면서 1씩 빼준다(완주했다는 것을 의미)
    completion.forEach((entry) => {
      hashed[entry] = hashed[entry] - 1
    })
    
    // 만약 1이 안빠졌으면(2에서 1이 되었든 1인데 안사라졌든)
    // 그 사람이 완주 못한 것!
    for (let key in hashed) {
      if (hashed[key] >= 1) return key
    }
    }
    明日か木曜日に資料構造の授業を受けます.

    2.正規表現


    正規表現は、文字列の検索と置換に使用できる形式言語(モード)です.文字検索から電子メール、パスワードチェックなど複雑な文字マッチング機能まで、正規モードで素早く実行できます.
    ... 読みやすさが本当に悪い...ㅠㅠ一般的にコードを見れば理解できるでしょうが…これは本当に分からないので勉強を続けたいと思います.
    正規表現は主に次の役割を果たします.
    1. 문자 검색(search)
    2. 문자 대체(replace)
    3. 문자 추출(extract)
    JavaScriptの利点は、正規表現を直接構築してサポートすることです.
    正規のテストサイトがあるそうです.
    少なくとも表現できないので、いつも確認が必要です.
    https://regex101.com/
    1)正規表現の作成
    // new RegExg(표현식, 플래그) // 생성자 함수 방식
    const regexp2 = /^abc/gi;
    // /표현식/플래그 // 리터럴 방식
    2)標識
    タグgは、「すべての文字を検索する」ことを示す.
    したがって、gのない式は1つの(最初の)検索結果のみを返し、gのある式はすべての検索結果を配列に返します.
    まず構成がこの程度なので、使い続けてみるべきです.
    問題によくある置換()のようです.

    3.アレイのコピー


    以前検索した時に使った用語のようです.良いコピーと深いコピー!
    何か変な内容があるようですが、今は理解を遅らせることができないので、勉強することにしました!
    浅いコピー
    コピーを作成するのではなく、元のコピーを参照してコピーします(実際にはコピーではありません)
  • 文字列タイプコピー、変更コピーオリジナルは変更されません.
    let str1 = 'original'
    let str2 = str1
  • str2 = 'copied'
    
      를 하여도 str1의 내용은 바뀌지 않는 것.
      
      하지만
      - array는 얘기가 달라진다.
      
    let arr1 = [1,2,3]
    let arr2 = arr1
    arr2[0] = 0
    
       하면, arr1 또한 변경된다. arr2로 복사할 때 복사한 것이 아니라 참조값만 복사되었기 때문!! 변경되는 부분의 메모리는 같은 곳을 가리키고 있기 때문에 원본값도 바뀌게 되는 것이다.
      
      
      2. 깊은 복사 (deep copy)
       
       따라서 원본과 사본을 따로 나누는 완전한 복사가 필요하다.
       
       - 배열의 깊은 복사
       Array.prototype.slice() 사용하면 새로운 배열을 반환해준다.
    
    [참고 및 출처] https://bbaktaeho-95.tistory.com/37
    
    
    
    #### 4. 문자열 관련
    
    1. Set 함수 (중복된 값 제거)
    [...new Set(array)]
    
    array에서 중복된 값들을 제거해준다. 이 함수도 알아두면 아주 좋을 것 같다.!!