ABC417の感想戦

目次

AtCoder Beginner Contest 417に参加したが、今回もコンテスト時間中に正解できたのは、AとB問題のみ。C問題を正解できるようになりたいが、とりあえずAとB問題を振り返る。


A - Substring

問題:A - A Substring

文字列Sが与えられるので、先頭のA文字と最後のB文字を削除した文字列を答える問題。

考え方

Pythonは、文字列は配列と同様に扱える。そして、配列はsliceが使えるので、[A:-B]を切り出す。

技術的工夫

配列を後ろから数える場合は、\(-1, -2, \cdots\)とする。そこで、Bをマイナスにするため\(-1\)を掛け算するが、変数名の前に-を付けると符号がマイナスになる。

Bが0の場合は、[A:0]とすることが出来ない、そこで条件分岐して対応する。

N, A, B = map(int, input().split())
S = input()

if B == 0:
    print(S[A:])
else:
    print(S[A:-B])

B - Search and Delete

問題:B - Search and Delete

数列AとBが与えられる。この数列Aから、数列Bに含まれる数を削除した結果を答える問題。

考え方

配列の長さはそれぞれ最大100なので、二重ループしても\(10^4\)であり特別な工夫は不要と判断した。

数列Bの各値ごとに配列Aをスキャンして、同じ値を見つけたら削除する。

技術的工夫

Pythonの配列から指定位置の値を削除するには、pop()を使用する。pop()の引数がない場合には、配列の最後から削除するが、引数を指定すると、してした位置の値を削除する。

N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

for i in B:
    for j in range(len(A)):
        if i == A[j]:
            A.pop(j)
            break
print(*A)