[プログラマー]2018 KAKAO BLIND RECRUIMENT[第1ラウンド]秘密地図/Java


📝 秘密の地図


✔¥質問説明


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

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


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


    元の秘密地図を復号し、「#」と出力し、スペースからなる文字列の配列です.

    勘定科目勘定科目I/Oの例


    パラメータ値n 5 arr 1[9,20,28,18,11]arr 2[30,1,21,17,28]出力[#######################################################]
    パラメータ値n 6 arr 1[46,33,33,22,31,50]arr 2[27,56,19,14,14,10]出力[######################################################################################

    👩🏻‍💻 に答える

    class Solution1 {
    	public String[] solution(int n, int[] arr1, int[] arr2) {
    		String[] answer = new String[n];
    		String code = "";
    		String mapCode = "";
    		
    		for(int i = 0; i < n; i++) {
    			code = String.format("%0"+n+"d", Integer.parseInt(Integer.toBinaryString(arr1[i] | arr2[i])));
    			mapCode = code.replaceAll("1", "#");
    			mapCode = mapCode.replaceAll("0", " ");
    		
    			answer[i] = mapCode;
    		}
    
    		return answer;
    	}
    }

    最初のコミット時に、テスト2とテスト6でランタイムエラーが発生しました.
    地図の1辺の大きさは最大16で、intの範囲を超えた部分がLong運転に変わるとは思いもよらなかったのですが、成功しました!
    class Solution {
    	public String[] solution(int n, int[] arr1, int[] arr2) {
    		String[] answer = new String[n];
    		String code = "";
    		String mapCode = "";
    		
    		for(int i = 0; i < n; i++) {
    			code = String.format("%0"+n+"d", Long.parseLong(Integer.toBinaryString(arr1[i] | arr2[i])));
    			mapCode = code.replaceAll("1", "#");
    			mapCode = mapCode.replaceAll("0", " ");
    			answer[i] = mapCode;
    		}
    		return answer;
    	}
    }

    📎 or演算子(|)


    地図1または地図2のいずれかが壁である部分は、地図全体でも壁である.地図1と地図2の両方が空白である部分は、地図全体においても空白であるため、or演算を適用する

    📎 Integer.toBinaryString(int i)


    Integerクラスの関数を使用してバイナリに変換

    📎 Integer.ParseInt(String s,int n進法)


    最初のパラメータ値として数値文字列を受信し、変換する進数値を入力すると、対応する進数値に変換され、Integerに戻ります.

    📎 Integer.parseInt(String s) / Long.parseLong(String s)


    パラメータ値として数値文字列が受信されると、10進数のInteger型またはLong型の文字列が返されます.

    📎 String.format( )

  • 文字列フォーマットを指定する関数
  • %d (= Integer Formatting)
    ex 1)%10 d:文字列の左側にスペースを10で埋めます.
    ex 2)%-10 d:文字列の右側に空白を埋め、長さは10
    ex 3)%010 d:文字列の左側に0を入力して10の長さを作成
  • 📎 replaceAll(String regex, String replacement)

  • ターゲット文字列を所望の文字値に変換する関数
  • 最初のパラメータは、変換する文字列
  • です.
  • の2番目のパラメータは、変換する文字値
  • です.