見出し画像

[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を使いました。

また、")"を見つけたからと言って、
その前に"("がなければ、削除できないので、
"("の数もカウントしておきましょう。

この記事が気に入ったらサポートをしてみませんか?