見出し画像

[ABC296 Python]AtCoder Beginner Contest 296A~D問題Python解説

A問題

# 入力
N = int(input())
S = input()
# 文字列Sの中に"MM"と"FF"がない場合Yes、それ以外の場合はNoと出力する。
if "MM" not in S and "FF" not in S:
    print("Yes")
else:
    print("No")

問題文の最後にヒントが書かれていますね。

「男性同士が隣り合う箇所も女性同士が隣り合う箇所も存在しないとき、かつ、そのときに限り、男女が交互に並んでいるといいます。」

この文のとおりに書ければいいと思います。
男性同士が隣り合うのはSの中にMMが存在するとき、
女性同士が隣り合うのはSの中にFFが存在するときです。
上記は条件に当てはまらないのでNo、
それ以外の場合はYesです。

B問題

# 左から列名を表すW_list
W_list = ["a", "b", "c", "d", "e", "f", "g", "h"]
# 下から行名を表すH_list
H_list = ["8", "7", "6", "5", "4", "3", "2", "1"]
# 入力
# "*"の文字を探してその列名・行名を続けて出力する
for i in range(8):
    S = input()
    for j in range(8):
        if S[j] == "*":
            print(W_list[j]+H_list[i])        

いろいろなやり方が考えられますが、
事前に名前を割り当てておくやり方が良いでしょう。

問題文のとおり、
グリッドの各マスは「列名+行名」
で名づけられており、
それをそれぞれW_listとH_listとします。

後は入力されたグリッドの中からコマが置かれているマスを探し、
その座標に対応したマスの名称を出力します。

C問題

# 入力
# 数列Aの要素同士のかぶりは必要ないので、set型で代入する
N, X = map(int, input().split())
A = set(map(int, input().split()))
# 全てのAの要素に対して、+XしたものがAに存在するかどうかを確認する
for a in A:
    if a+X in A:
        print("Yes")
        exit()

print("No")

数列Aをリスト型で入力し、全ての要素に対してAi-Aj=Xとなるものを探すとTLEになります。

今回は条件を満たすものが1つでも存在すればその時点でYesと判定されるので、数列Aのかぶりをなくすことで、時間内で解くことができます。

数列Aをset型で入力し、全てのAの要素iに対してX+iがAに存在するか
確かめます。

D問題

後日記載します。



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