ml_begin’s blog

Python初心者が、機械学習、画像認識、Web解析について取り組んでいきます。

AtCoder(競プロ)〜1日1問【10日目】

f:id:ml_begin:20180604073123j:plain
本日は AtCoder Beginner Contest 096 のC問題。
abc096.contest.atcoder.jp
今回の問題は要約が難しいのでリンク先で確認していただければと思います。
そしてよく分からなかったので、他人のコードの理解。
以下のコードが他の人のコードです。

#空白を区切り文字として入力値を変数に格納
H,W=map(int,input().split())

#今回の問題では指定行番号・列番号の上下の値を参照するので
#本来ない文字列['."*(W+2)]を加えることにより異常参照の発生をなくしている。
C=['.'*(W+2)]+['.'+input()+'.'for _ in[0]*H]+['.'*(W+2)]

#range(下限,上限)は、(下限)以上(上限)未満の範囲となるのでH+1,W+1とする
for i in range(1,H+1):
    for j in range(1,W+1):

#上下に'#'がいなければ、C[i,j]は黒く塗られない
        if C[i][j]=='#'and'#'not in[C[i-1][j], C[i][j-1], C[i][j+1], C[i+1][j]]:
            print('No')
            exit()
print('Yes')
C=['.'*(W+2)]+['.'+input()+'.'for _ in[0]*H]+['.'*(W+2)]

この表現は初めて見たので試します。
まず

["."*(5)]

とすると出力結果は、
Out[1]: ['.....']
文字列×数字でその文字列を繰り返すことができる。

そして次に

['.'+input()+'.'for _ in[0]*H]+['.'*(W+2)]

入力値を'.'と'.'×H(行)分+'.'*(W+2)で挟む。
ここで

for _ in[0]*H

は先ほどと同じ発想で
[0]としているのは
Hは整数型であり、配列として加えることができないためです。

時間が遅くなりましたが無事10日目到達。