見出し画像

[ABC261]AtCoder Beginner Contest 261 A~C問題Python解説

A問題

l1, r1, l2, r2 = map(int, input().split())

ll1 = [_ for _ in range(l1, r1)]
ll2 = [_ for _ in range(l2, r2)]

ll1_ll2_and = set(ll1) & set(ll2)
print(len(l1_l2_and))

リストにするとイメージしやすいです。
入力例1を参考にします。
ll1 = [0 1 2]
ll2 = [1 2 3 4]
set() & set()で共通部分を取り出します。
この場合だとll1_ll2_and = [1 2]ですね。
最後に個数(長さ)を出力します。

B問題

n = int(input())
a = [input() for i in range(n)]

for i in range(n):
    for j in range(n):
        if i == j:
            continue
        else:
            if a[i][j] == "W" and a[j][i] == "W":
                print("incorrect")
                exit()
            elif a[i][j] == "W" and a[j][i] == "D":
                print("incorrect")
                exit()
            elif a[i][j] == "D" and a[j][i] == "W":
                print("incorrect")
                exit()
            elif a[i][j] == "D" and a[j][i] == "L":
                print("incorrect")
                exit()
            elif a[i][j] == "L" and a[j][i] == "D":
                print("incorrect")
                exit()
            elif a[i][j] == "L" and a[j][i] == "L":
                print("incorrect")
                exit()
print("correct")

制約よりNの値が小さいので、全部探しましょう。
総当たり戦はイメージしやすいと思いますが、WとL、DとDが組になります。
問題文にも書いてありますが、a[i][j]の対戦相手はa[j][i]ですね。
この対戦する同士が、WとL、DとDの組み合わせになっているかを確認します。
1回でもこの組み合わせに反するものがあれば×です。

C問題

n = int(input())
ss = {}
for i in range(n):
    s = input()
    if s not in ss:
        print(s)
        ss[s] = 1
    else:  
        sss = s + "(" + str(ss[s]) + ")"
        print(sss)
        ss[s] += 1

問題文の「Siと同じ文字列が存在」が「Siを含む文字列」とかだともうちょっと難しくなるのですが、この場合だと問題文そのままでできると思います。

まず、出力に必要なので、文字列と文字列の個数を保存します。
リスト2つを組み合わせてもいいですが、今回は辞書を使います。
辞書については以下

キーが文字列、値がその文字列の個数を表します。

では実際に作業に入りましょう。
以下の動作をN回行います。

文字列を入力します。
入力した文字列が存在しないならば、
新しく辞書に追加します。
ss[文字列]=1
とします。
出力は問題文のとおり文字列をそのままです。

入力した文字列が存在するならば、
同じ文字列が何個出てきているのかを
ss[文字列]
で調べます。
うまくSi​+(+X+)の形に調整して出力します。
最後に文字列の個数を+1するのを忘れずに。


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