[プログラマー]level 1 2018 KAKAO BLIND RECRUITMENT[第1ラウンド]秘密マップ


2018 KAKAO BLIND RECRUITMENT[1]シークレットマップ


これは基本的な二次元配列問題のようですが、問題を解くときに新しく知った内容があるので、書きます.
ニオは秘密の地図を手に持って、プロドが普段私房のお金を隠している場所を教えた.しかし、この秘密地図はデジタル暗号化されており、位置を確認するために解読が必要です.幸いなことに、地図のパスワードを解読する方法が書かれたメモも見つかった.
  • 地図は、余白("")または壁(#""")の2種類のセルからなる辺長nの正方形の配列です.
  • 地図全体を2枚の地図で重ねることができる.それぞれ地図1と地図2を言います.地図1または地図2のいずれかが壁である部分は、地図全体でも壁である.地図1と地図2の空白部分は、地図全体においても空白である.
  • 地図1と地図2はそれぞれ整数シーケンスで暗号化されている.
  • 暗号化された配列は、地図の横線ごとに壁部分を1に符号化し、空白部分を0に符号化したときに得られるバイナリ値の配列である.

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

    入力フォーマット


    地図に入る枠線のサイズnと2つの整数配列arr1arr2を入力します.
  • 1 ≦ n ≦ 16
  • arr1,arr2は整数配列であり、長さはnである.
  • 整数配列の各要素xをバイナリ数に変換した場合の長さn以下.すなわち、0≤|2 n-1を満たす.
  • 出力フォーマット


    元の秘密マップを復号し、x'#'からなる文字列配列に出力します.

    💻 コード#コード#

    import string
    tmp = string.digits + string.ascii_lowercase
    def convert(num, base):
        q, r = divmod(num, base)
        if q == 0:
            return tmp[r]
        else:
            return convert(q, base) + tmp[r]
    
    def solution(n, arr1, arr2): # [9, 20, 28, 18, 11]
        answer = []
        # 1. 지도 두 개 만들기
        map1 = [['' for _ in range(n)] for _ in range(n)]
        map2 = [['' for _ in range(n)] for _ in range(n)]
        for idx, i in enumerate(arr1): # 9 20 28 ...
            #print(convert(i, 2).zfill(n))
            for jdx, j in enumerate(convert(i, 2).zfill(n)):
                map1[idx][jdx] = j
                #print(map1[idx][jdx])
        for idx, i in enumerate(arr2): # 9 20 28 ...
            #print(convert(i, 2).zfill(n))
            for jdx, j in enumerate(convert(i, 2).zfill(n)):
                map2[idx][jdx] = j
                #print(map2[idx][jdx])
        # 2. 두 개의 지도 합치기
        board = [['' for _ in range(n)] for _ in range(n)]
        for i in range(n):
            for j in range(n):
                if map1[i][j] == '1' or map2[i][j] == '1':
                    board[i][j] = '#'
                else:
                    board[i][j] = ' '
        # print(board) # 	[['#', '#', '#', '#', '#'], ['#', '', '#', '', '#'], 
        for row in board:
            answer.append(''.join(row))
        return answer
    2進数に変換すると、01001が必要で、前の0が遮断され、1001の形で現れます.
    この場合,zfill(width)関数を用いて解決できる.str形式で入らなければなりません.
    # '01001'
    '1001'.zfill(5)