[C++]level 1秘密地図50067


📌 秘密の地図


📌に答える


この問題はKakao解説にも以下のように書かれている.
これはビット操作の問題です.問題例にはバイナリ形式で処理するプロンプトが含まれており、そのうちの1つが1の場合、壁#が表示されるため、ORを使用すると解法が簡略化されます.簡単な質問だったのでifelseで説明している人がたくさん見つかりましたこれは正解とみなされますが、ビット演算に関する問題なので、将来このような問題を解決する際には、ビット演算を必ず覚えておいてください.この問題の正解率は81.78%だった.
問題では、I/Oの例を示し、次の写真を示します.

暗号化されたスキームは、地図の各水平線上にあります. 1、空白部分を 0に符号化したときに得られるバイナリ値の配列.
この二つを見るとこの問題の核心です!論理!それがor演算(|)であることがわかります.
  • 各arr 1およびarr 2の水平線の値は、1つのバイナリ値、
  • である.
    2つの値
  • に対してOR(|)演算を行う.(0101|1010=1111//いずれかが1の場合は1とみなす)
  • 演算の値が4ビット(0001)であると仮定し、各位置(0,0,1)の値を確認します.
    3-1. 1(壁)の場合は、解答欄のiの位置に「#」を付けます.
    3-2. 0(空白)の場合、答え配列のi位置に「」を付けます.
    //stringを加えるとappend()!
  • AND(&)演算子を使用して、各場所のインデックス値を返します.
    (temp & (i << j) ==  temp값과 1 << j (1을 j만큼 shift)한 값과 AND연산하여 인덱스 값 구함
    ex. temp ==  10101
         4번째 비트 값 : 10101 & (1 << 3) = 10101 & 010000
         5번째 비트 값 : 10101 & (1 << 4) = 10101 & 1000010000
    注意事項
  • 最初に解答バックグラウンドを初期化しないとエラーが発生します.
  • 📌コード#コード#

    #include <string>
    #include <vector>
    
    using namespace std;
    
    vector<string> solution(int n, vector<int> arr1, vector<int> arr2)
    {
        vector<string> answer(n, ""); //n개 짜리 백터를 ""로 초기화
    
        for (int i = 0; i < n; i++)
        {
            int bit = arr1[i] | arr2[i]; //row별로 비트 계산
            for (int j = n - 1; j >= 0; j--)
            {
                if (bit & (1 << j))
                { //최하위 비트부터 탐색(1 << j)!! 해당 위치의 인덱스 값 반환
                    //append()는 string의 함수
                    answer[i].append("#");
                }
                else
                {
                    answer[i].append(" ");
                }
            }
        }
    
        return answer;
    } 
    振り返る
    この問題の友達は同期と一緒に試験問題認証の勉強をしていて、ビット演算で解くことを勧められたので、もう一度解いてみました.
    前回もビット演算で解決した問題でしたが、解答がわかったら近づきやすいのですが、解答を思い出すまで頭で考える問題なので覚えておいて、待っていてください.
    ビット演算!!!!勉强しましょう!!!!!!!!
    参考資料