AtCoderに初めて挑戦しました。
参加したコンテストはAtCoder Beginner Contest 430です。
Aは10分くらいで解けたのですが、Bから全然わかりませんでした。正直なところifやforについて知識はあるけどいざ実践となるとわけがわからなくなりますね。それは練習あるのみとして、python言語の関数や型には私の知らないことがまだまだあるようです。それはそうですよね(笑)
今回のBは2Dスライディングウィンドウの問題でした。
以下はBについての解説にあったpythonコードです。
N,M=map(int,input().split())
S=[input() for _ in range(N)]
grid_set=set()
for i in range(N-M+1):
for j in range(N-M+1):
grid = tuple(S[ii][j:j+M] for ii in range(i,i+M))
grid_set.add(grid)
print(len(grid_set))
めっちゃシンプルで驚きました。python言語ってすごいですね。
効率よくリストで管理し、for i in range(...)とfor j in range(...)という2重のforループで行と列のスライドを行い
S[ii][j:j+M] for ii in range(i,i+M)
で小さなまとまりを切り出しているようです。
私は入力されたstr型をリストに入れて管理しようとしたため、入力部分だけでかなり複雑になってしまいました。
N,M = map(int, input().split())
def make_boxs(N,M):
s_box = ["a","b","c","d","e","f","g","h","i","j"]
b_box = list()
for n in range(N):
s_box[n] = list(input())
b_box.append(s_box[n])
return b_box
b_box = make_boxs(N,M)
解説では内包表記を使うことでinputの際に一行でコードを書くことができています。
それと、setは順番を保持しませんが、tupleをsetに入れることで切り出したまとまりを順番を変えることなく種類数を求めることができるようです。listをsetに入れることはできないので注意が必要です。
一か月で色々学んだのでいつ、どんな時に、何を使えばいいかもっと勉強しないといけませんね。