ABC394感想
4完の難易度が非常に低い回でしたね、下位層の人間からするとどれだけスピードを出せるかの勝負だったと思います。
A問題
要するに文字列に含まれる2の数は何文字か。って話です。
解法はいくらでもあると思いますが、雑に通しました。
ちなみにコンテスト開始に間に合わず、スマホから一度投稿したのですが、2を文字列にしておらず1ペナもらいましたが、これが致命傷でした。二度とやらない。
l = list(input())
for i in l:
print(2 if i == "2" else "", end="")
B問題
文字列を長さ順に結合しろって問題です。
文字列を長さ順に並び替えたものを結合させる以上の解説はいらないと思います。
print("".join([s for s in sorted([input() for _ in range(int(input()))], key = lambda x: len(x))]))
C問題
文字列中にWAがなくなるまで、WAをACに変換しろって問題です。
流石に愚直にやるわけにもいかないので、ひと工夫入れましょう。
WAをACに変換することで、Aの手前にあるWは消えるものの、Aはそのまま残るため、WWAのようにWが続いていれば、WWA→WAC→ACCと変換することが出来ることが重要です。
要するにWAの形を見つけて、連続しているWをそのままCに変換し、Aの後ろに持ってきてやれば終わりです。
import itertools as it
l = list(input())
d = [[a, len(list(b))] for a, b in it.groupby(l)]
ans = []
for a, b in zip(d, d[1:]):
if a[0] == "W" and b[0] == "A":
ans += ["AC"] + ["C"] * (a[1] - 1)
b[1] -= 1
else:
ans += [a[0]] * a[1]
ans += [d[-1][0]] * d[-1][1]
print(*ans, sep="")
D問題
要するに() や {} のある計算式がちゃんと解けるようになっているか?を答える能力があるか聞かれている問題です。
手前から順に(などのカッコの始まりはストックにため、)などの閉じカッコはストック順にチェックをし、通ったらOK、駄目だったり、少なかったりしたらNG。
どっちかというとなんでそれで通るのかを説明する方が難しい気がしますね。
import collections as cs
d = {")": "(", "]": "[", ">": "<"}
x = cs.deque()
for s in list(input()):
if s not in d.keys():
x.append(s)
elif x and d[s] == x[-1]:
x.pop()
else:
x = ["a"]
print("Yes" if not x else "No")