ABC107-B - Grid Compression を解く
ABC107-B - Grid Compression
実装系の問題
白いマスと黒いマスからなるマス目が与えられる
白いマスのみからなる行や列がある場合、その行/列を除外し圧縮していく
入力は1行ずつ受け取るので、行の圧縮は受け取った時点で
行なってしまえばいい
列の圧縮についてはリストに入力を受け取った後
列方向の中身を参照して確認していくことにする
以上を踏まえて書いたコードを以下に示す
提出したコード
# 入力 H,W=map(int,input().split()) l=[] for i in range(H): x=input() # 白いマスのみからなる場合は追加しない if x!='.'*W: l.append(x) rm=[] for i in range(W): # フラグ f=True for j in range(len(l)): if l[j][i]=='#': f=False # 取り除く列の添字を保存しておく if f: rm.append(i) a=[] for x in l: for i in rm[::-1]: x=x[:i]+x[i+1:] a.append(''.join(x)) # 出力 for i in range(len(a)): print(''.join(a[i]))
まず入力の時点で、"." からなる行は省いている
これで行の圧縮は完了
l=[] for i in range(H): x=input() # 白いマスのみからなる場合は追加しない if x!='.'*W: l.append(x)
次に入力値について、列方向の要素を確認
"#" が1つも含まれない列番号を rm 変数に保存する
rm=[] for i in range(W): # フラグ f=True for j in range(len(l)): if l[j][i]=='#': f=False # 取り除く列の添字を保存しておく if f: rm.append(i)
rm 変数に保存した列番号は省いて出力を行う。これで列方向の圧縮も完了
( list のスライスを利用している)
a=[] for x in l: for i in rm[::-1]: x=x[:i]+x[i+1:] a.append(''.join(x)) # 出力 for i in range(len(a)): print(''.join(a[i]))
提出結果はACでした
今回は実装が結構複雑になってしまった
解説PDFを読んでみると、自分の行/列を除去していく方法とは
逆のアプローチで解いており、そちらの方がシンプルで良いと感じた
興味のある方はそちらも確認してみてください
AtCoder Beginner Contest 107 解説