ABC307

# ABC307
こんにちは。
仕方ないこととはいえ、調子よかった先週がunratedで結構つらいですが、引き続き頑張りましょう。
今回はABC307( https://atcoder.jp/contests/abc307 )。相も変わらずサーバーは大きな負担がかかってるみたいですね。。。

# A
数値が7Nで与えられるので7つごとに区切ってそれぞれの和を出す。スライス使って対処した。
```diff_python
N = int(input())
l = list(map(int, input().split()))
ans = []
for i in range(N):
  ans.append(sum(l[i*7:(i+1)*7]))
for a in ans:
  print(a, end=" ")
```

# B
2つの文字列をつなげて回文かを判定する。スマートな方法が思いつかず、与えられる文字列が100個までということで、全探索で進めた。
```diff_python
N = int(input())
l = []
ans = "No"
for i in range(N):
  l.append(input())
for a in l:
  for b in l:
    if a == b:
      continue
    s = a + b
    flg = True
    for i in range(len(s)//2):
      if s[i] != s[-1-i]:
        flg = False
        break
    if flg:
      ans = "Yes"
      break
print(ans)  
```

# C
黒マスと透明マスを持つ2つのシートを組み合わせ、正解シートを作れるかの判定問題。各シートの黒マスの位置関係が分かるような配列を作り、2つのシートの配列を組み合わせて正解シートの配列と一致するかを判定させた。が、なぜか不正解。未だにその原因が解消せず、ACには至ってないがコードを一応残しておく。~~waだした2つのデータ見せてくれ~~
```diff_python
#各シートの黒マスの座標を配列で取得
H_a, W_a = map(int, input().split())
l_a = []
for i in range(H_a):
  s = input()
  for j in range(W_a):
    if s[j] == "#":
      l_a.append(i*1000 + j)#1の位にx座標、1000の位にy座標う
H_b, W_b = map(int, input().split())
l_b = []
for i in range(H_b):
  s = input()
  for j in range(W_b):
    if s[j] == "#":
      l_b.append(i*1000 + j)
H_x, W_x = map(int, input().split())
l_x = []
for i in range(H_x):
  s = input()
  for j in range(W_x):
    if s[j] == "#":
      l_x.append(i*1000 + j)

ans = "No"
for i in range(len(l_x)):
  adv = l_x[i]#シートAの左上の地点を正解シートのどこの部分とみなすか
  black = [adv]#シートAで埋めることができる正解シートの黒マス部分
  flg = True
  for j in range(1,len(l_a)):
    #l_a[j] - l_a[0]でシートAの左上の黒マスと他の黒マスとの位置関係を表し、
    #advを加えて正解シートの座標の比較を可能にした。
    if l_a[j] + adv - l_a[0] in l_x:
      black.append(l_a[j] + adv - l_a[0])
      continue
    else:
      flg = False
      break
  if flg:#シートAのすべての黒マスが正解シートの黒マスと一致した場合
    flg_b = True
    #シートBでも同様の処理
    for k in range(len(l_x)):
      adv_b = l_x[k]
      black_b = []
      #最終的にAとBの黒マスリストをまとめて正解シートと比較する
      #そのため、同じ座標を取らないための条件文
      if adv_b not in black:
        black_b.append(adv_b)
      for j in range(1, len(l_b)):
        if l_b[j] + adv_b - l_b[0] in l_x:
          if l_b[j] + adv_b - l_b[0] in black:#同じ座標を取らないための条件文
            continue
          else:
            black_b.append(l_b[j] + adv_b - l_b[0])
            continue
        else:
          flg_b = False
          break
      black_all = black + black_b
      black_all.sort()
      if black_all == l_x and flg_b:
        ans = "Yes"
        break
    if len(ans) == 3:
      break

print(ans)
```

原因が気になりすぎる。

# D
文字列から"("")"で囲まれた部分と"("")"自身を削除していき、最終的に残った文字列を表示する。"("の位置を配列で保持し、")"が現れた場合、配列内の末尾の座標から現在座標までを順々削除していく。"("もなくなるため、末尾から取得する際、popなどを用いて末尾の値は削除しておく。また、sの長さは変化していくため、for文ではなくwhile文で対処。
```diff_python
N = int(input())
s = input()
l_left = []
i = 0
while i < len(s):
  if s[i] == "(":
    l_left.append(i)
  if s[i] == ")" and len(l_left) != 0:
    pre = l_left.pop(-1)
    s = s[:pre] + s[i+1:]
    i = pre - 1
  i += 1
print(s)
```

# 反省・感想
Cに苦しめられた回でした。Dのほうが簡単な問題であったため、早い段階で見切りをつけてDを取り組むべきでした。WA2つだったので行けると思ってしまいました。。。コード量も結構多めだったので時間取られましたね。 ~~ぶっちゃけEよりも正解者数少ないのは異常事態では。~~ 未だにC解決していないので、気になって眠れませんね。もしわかる方いたらご教授願いたいところです。
Eに関してはまだ取り組めていないので、時間とやる気の余裕次第で確認してみたいです。
次回も頑張りましょう。

現在レート:728 → 732