考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

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 解説