![見出し画像](https://assets.st-note.com/production/uploads/images/109094184/rectangle_large_type_2_3567cb9dd7526a5d5404778aea1edebc.jpeg?width=1200)
[ABC307 Python]東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 307)
A問題
# 入力N
N = int(input())
# 入力A
A = list(map(int, input().split()))
# 1週間ずつ歩数の合計を空白区切りで出力する
for i in range(N):
print(sum(A[7*i:7*(i+1)]), end=" ")
1週間ずつ合計の歩数を出力します。
空白区切りで、合計値を出力します。
B問題
# 入力N
N = int(input())
# 入力S
S = [input() for _ in range(N)]
for i in range(N):
for j in range(N):
s = S[i]+S[j]
# 相違な整数i,jかつ文字列が回文
if i != j and s == s[::-1]:
print("Yes")
exit()
print("No")
iとjが相違であれば、
Si+Sjが回文であるか判定し、
回文であればYesと出力します。
C問題
# 入力Ha,Wa
Ha, Wa = map(int, input().split())
# シートAの黒いマスの座標を保存
black_A = set()
for i in range(Ha):
# 入力A
A = list(input())
for j in range(Wa):
# 黒いマス="#"だったら座標を保存
if A[j] == "#":
black_A.add((i, j))
# 入力Hb,Wb
Hb, Wb = map(int, input().split())
# シートBの黒いマスの座標を保存
black_B = set()
for i in range(Hb):
B = list(input())
for j in range(Wb):
# 黒いマス="#"だったら座標を保存
if B[j] == "#":
black_B.add((i, j))
# 入力Hx,Wx
Hx, Wx = map(int, input().split())
# シートXの黒いマスの座標を保存
black_X = set()
for i in range(Hx):
X = list(input())
for j in range(Wx):
# 黒いマス="#"だったら座標を保存
if X[j] == "#":
black_X.add((i, j))
# Aの黒いマスの座標を-Hx~Hxの範囲で移動する
moved_black_A = []
for i in range(-Hx, Hx):
for j in range(-Wx, Wx):
a = set()
for k in black_A:
a.add((k[0]+i, k[1]+j))
moved_black_A.append(a)
# Bの黒いマスの座標を-Hx~Hxの範囲で移動する
moved_black_B = []
for i in range(-Hx, Hx):
for j in range(-Wx, Wx):
b = set()
for k in black_B:
b.add((k[0]+i, k[1]+j))
moved_black_B.append(b)
for i in moved_black_A:
for j in moved_black_B:
# AとBの黒いマスの座標とXの黒いマスが等しければ、
# Yesと出力する
if i|j == black_X:
print("Yes")
exit()
print("No")
シートAとシートBを動かしながら、シートXと一致するようにします。
シートをすべて動かす必要はなく、黒いマスの座標だけ動かします。
シートAとシートBはシートXの範囲(Hx,Wx)の倍の範囲である、(-Hx~Hx,-Wx~Wx)の範囲で移動します。
移動後の座標候補の中から、シートAとシートBの重ね合わせたシートとシートXが等しければ、目標を達成できます。
D問題
# インポート
from collections import deque
# 入力N
N = int(input())
# 入力S
S = input()
# 答えとなるdeque
d = deque()
# "("が出てきた回数c
c = 0
# Sの全ての文字sについて
for s in S:
# sを答えに追加
d.append(s)
# "("だったら、cに1加える
if s == "(":
c += 1
# ")"で、以前に"("が存在したら、
# "("になるまで削除する
elif s == ")" and c > 0:
ss = ""
while ss != "(":
ss = d.pop()
# cから1引く
c -= 1
print("".join(d))
先頭から")"になるまで文字を追加していき、
")"になったら戻って、"("まで削除します。
今回は文字列の状態を保存するために、
dequeを使いました。
また、")"を見つけたからと言って、
その前に"("がなければ、削除できないので、
"("の数もカウントしておきましょう。
この記事が気に入ったらサポートをしてみませんか?