問題
黒を表す'#'と白を表す'.'で構成されたマス目において、'.'しか存在しない行(または列)を削除して出力するという問題。
方針
以下の方針でAC。
-
行方向の探索
行方向に'.'の数をカウントして、列数と一致するとすべて白マスだと判定し、その行を削除する。 -
列方向の探索
それぞれの行で見たときにすべての行で'.'であるインデックスが存在すれば、その列の要素すべてが白マスだと判定して、その列を削除する。
pythonのset型の積集合を用いて、すべての行のインデックスの要素で共通するインデックスを特定する。 -
上記の行と列を削除したものを出力する。
H, W = map(int, input().split())
a_list = [list(input()) for _ in range(H)]
# 白マスを表す'.'の数をカウント
dot_cnt = [sum([a == '.' for a in a_col]) for a_col in a_list]
# すべてが'.'とならない行のインデックスを取得
exist_idx = [i for i, num in enumerate(dot_cnt) if num != W]
# set型で表現する集合の初期化(今回は積集合をとるため、すべてのインデックスを含む集合を定義)
st = set(range(W))
for i in exist_idx:
# それぞれの行における'.'のインデックスを取得
dot_idx = [i for i, a in enumerate(a_list[i]) if a == '.']
# 積集合を取得(すべての行を探索した後に生き残ったインデックスがすべて白マスの列を表現)
st = st & set(dot_idx)
for i in exist_idx:
# 出力の整形(リストをjoinすることで文字列の連結を実現)
print(''.join([a for i, a in enumerate(a_list[i]) if i not in st]))
別解
自分では思いつかなかったが、配列を転置させる解法も存在。
これも知らなかったが、ndarrayではなくリストでもzipを用いて転置できるらしい。
【参考】
AtCoder Beginner Contest の B 問題全部やったので詰まったやつや面白かったやつを紹介する【Python3】
Python標準で転置行列