[プログラマー]秘密の地図


🤔 質問する


プログラマー-秘密の地図
2018 KAKAO BLIND RECRUITMENT
ニオは秘密の地図を手に持って、プロドが普段私房のお金を隠している場所を教えた.しかし、この秘密地図はデジタル暗号化されており、位置を確認するために解読が必要です.幸いなことに、地図のパスワードを解読する方法が書かれたメモも見つかった.
  • 地図は、エッジ長がnの正方形の配列形式であり、各セグメントは空白("")または壁(#")の2種類から構成されています.
  • 全図は、2つの地図を重ね合わせることによって得ることができる.それぞれ地図1と地図2を言います.地図1または地図2のいずれかが壁である部分は、地図全体でも壁である.地図1も地図2も空白の部分であり、地図全体においても空白である.
  • 地図1と地図2はそれぞれ整数配列で暗号化されている.
  • 暗号化された配列は、地図の各横線において、壁部分を1に符号化し、空白部分を0に符号化したときのバイナリ数の配列である.

  • ニオがフロドの私房金を手に入れるために、秘密地図のパスワードを解読するのに役立つプログラムを作成しました.

    ¥2,000円制限


    地図に入るエッジサイズnと2つの整数配列arr 1とarr 2を入力します.
  • 1 ≦ n ≦ 16
  • arr 1,arr 2は長さnの整数配列である.
  • 整数配列の各要素xがバイナリ数に変換されたときの長さはn以下である.すなわち、0≦x≦2 n−1を満たす.
  • 💡 に近づく


    まず,ファクタarr1, arr2の各要素をバイナリ数に変換することを解決する.binaryArray関数は、アレイ内の各要素をバイナリ数に変換する関数である.十進法9, 20をバイナリ数に変換すると1001, 10100になります.2進数に変換された要素の長さが一致しません.従って、変換後の元素長がn未満であれば、その元素の前に0を不足した長さで繰り返し入れる.
    2進数に変換されたbinaryArr1, binaryArr2地図が完成しました.今2枚の地図を合わせて秘密の地図を完成すればいいです.地図をマージするときは、次のルールが適用されます.
    0 + 0 은 빈 문자열(' ')로 변환
    0 + 1('#')으로 변환
    1 + 0('#')으로 변환
    1 + 1('#')으로 변환
    適用ルールのコードはparseInt(v2, 10) + parseInt(binaryArr2[i][j], 10) ? '#' : ' 'です.
    問題を解決し,他の人のコードを見て,ビット演算子では비트 OR(|)を用いて解決した.最初は文法が分からないので、検索して検索すれば分かります.演算子をビットに変換すると、対応する各ビットは1であり、1が1の場合、1の演算子が返されます.下記の参考になるリンクが掛かっています.
    アルゴリズムの解決方法は本当に多様だと思います.一人でいろいろな方法を試しても、既知の文法や聞いたことのある文法だけを少し修正したり、コードの長さを短くしたりするのはよくありますが、ビット演算子のような文法を全く知らないと、新しい試みもできません.問題を解決したら、他人のコードを見るだけで多くのことを学ぶことができます.

    🧑🏻‍💻 コード#コード#

    function binaryArray(n, arr) {
      return arr.map(v => {
        const binary = v.toString(2);
        return binary.length < n
          ? `${'0'.repeat(n - binary.length)}${binary}`
          : binary;
      });
    }
    
    function solution(n, arr1, arr2) {
      const binaryArr1 = binaryArray(n, arr1);
      const binaryArr2 = binaryArray(n, arr2);
        
      const secretMap = binaryArr1.map((v1, i) => [...v1]
        .map((v2, j) => parseInt(v2, 10) + parseInt(binaryArr2[i][j], 10) ? '#' : ' ')
        .join(''));
      return secretMap;
    }
    
    solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]);
    // ["#####","# # #", "### #", "# ##", "#####"]

    📝 リファレンス


    [画像ソース]KaKao Tech-Kaka新人公募第1回コードテスト問題解説
    MDN - Number.prototype.toString()
    MDNビット演算子