週末副業記

土日は副業エンジニアのブログです。副業に関することを投稿します。

文字を指定の数だけ繰り返す(AtCoder(競プロ)1日1問【10日目】【Python】)


AtCoder Beginner Contest 096 C問題

abc096.contest.atcoder.jp

 

競技プログラミングで使える関数を実際の問題を通して紹介いたします。

今回は「文字*数字」です。

 

文字を指定の数だけ繰り返す

この問題を解く中で「'.'*数字」という組み合わせを使用します。

これは文字*数字という処理を行うことによって文字の繰り返しをすることができます。

例えばこのような感じ。

f:id:aisakakun:20180818134839p:plain

"a"という文字に「5」をかけると出力結果は"aaaaa"となります。これを利用し、問題を解きます。

 

#空白を区切り文字として入力値を変数に格納
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は整数型であり、配列として加えることができないためです。

 

 

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで