[プログラマースコット練習]秘密地図


問題の概要


地図は、エッジ長がnの正方形の配列形式で、各セルは「空白」(「」)または「壁」(「#」)から構成されています.
地図全体を2枚の地図で重ねることができます.
地図1または地図2のいずれかは壁の部分であり、地図全体においても壁であり、すべての空白の部分のみが地図全体においても空白である.
「地図1」と「地図2」はそれぞれ整数配列で暗号化されている.
暗号化された配列は,地図の横線ごとに壁を1に符号化し,スペースを0に符号化したときのバイナリ値の配列である.
元の秘密地図を復号し、「#」と出力し、スペースからなる文字列の配列です.

私の答え


def solution(n, arr1,arr2):
    answer = []
    arr_1 = []
    arr_2 = []

    for i in arr1:
        a = ""
        while i>=2:
            a += str(i%2)
            i //= 2
        if i<2:
            a += str(i)
        a = a[::-1] if len(a)==n else "0"*(n-len(a))+ a[::-1]
        arr_1.append(a)

    for i in arr2:
        a = ""
        while i>=2:
            a += str(i%2)
            i //= 2
        if i<2:
            a += str(i)
        a = a[::-1] if len(a)==n else "0"*(n-len(a))+ a[::-1]
        arr_2.append(a)

    for i in range(n):
        a = ""
        for j in range(n):
            if arr_1[i][j]=="0" and arr_2[i][j]=="0":
                a += " "
            else:
                a += "#"
        answer.append(a)

    return answer

bin()、zfill()の使用状況を解析する

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.zfill(n)
        a12=a12.replace('1','#')
        a12=a12.replace('0',' ')
        answer.append(a12)
    return answer

zfill()関数


文字列の長さを指定すると、前から0でスペースを埋めて返します.
s =91657.zfill(8)
# 00091657
for i in range(3):
    print(str(i).zfill(4))
# 0000
# 0001
# 0002

バイナリ変換関数

bin():バイナリ変換、「0 ba」を返します.
bin(10) =0b1010bin(301) =0b100101101
oct():8進数変換、「0 oa」を返します.
oct(10) =0o12oct(233) =0o351
hex():16進数変換、「0 xa」を返します.
hex(10) =0xahex(145) =0x91
上記の関数ではなくint(x, 진수정보)に変換することもできます.
int(0b1010, 2) = 10
int(0o12, 8) = 10
int(0xa, 16) = 10

ビット演算子

& : and| : or^ : xor~ : not

に感銘を与える

  • 私のコードはパスしましたが、要領なく同じコードを繰り返し実現しました.利用可能な関数を思い出す習慣を身につけて、その前にもっと関数を知っておくべきです!
  • bin()、zfill()活用コードも効率的です.
  • zfill()の代わりにrjust()を使用することもできますが、効率と正確性には大きな違いはありませんが、zfill()はもっと簡単です.