ABC344の回
A-問題
[問題文]
英小文字と | のみからなる文字列 S が与えられます。
S は | をちょうど 2 個含むことが保証されます。
2 つの | の間にある文字および | を S から削除した文字列を出力してください。
[考察や感想]
解答用に用意した変数「 T 」に転記するタイミング、転記しないタイミングを変数「 flg 」を使って制御しました。
A.py
# 2024/3/9 本番解答
S = input()
# 解答用の変数と制御用の変数を用意する
T = ""
flg = 0
# flg の値で「転記する」「しない」を制御した
for c in S:
if c != "|" and flg == 0:
T += c
if c != "|" and flg == 2:
T += c
if c == "|":
flg += 1
print(T)
追記:解説を見たら、"|" で区切って、間を除去する方法が書いてありました。
それが一番スマートですね~。。。
A解説.py
# 2024/3/9 解説の模範解答
L = list(map(str, input().split("|")))
print(L[0]+L[2])
B-問題
[考察や感想]
Nの入力が与えられないというレアケースで、リスト格納に手間取りましたが、順に入力してくる値の最後が「 0 」とわかっているので、ループから出る記述を追加した。入力とは、逆の順に出力して正答となりました。
B.py
# 格納用の配列を用意
A = []
for _ in range(101):
a = int(input())
A.append(a)
if a == 0:
break
L = len(A)
# 配列A を末尾から順番に出力する
for i in range(L-1,-1,-1):
print(A[i])
C-問題
[考察や感想]
まず最初に問題通りの動作を実装しましたが、TLEで通りませんでした。そこは、想定通りでいかに高速化するかを考えました。
全パターンでは、多すぎると考えられるので
・配列X の最大値を取得して、それ以上の値を除去
・set() に格納して、一意に集約
なんとか、TLEを回避できました。
C.py
# 問題通りに順番に変数に格納
N = int(input())
a = list(map(int, input().split()))
M = int(input())
b = list(map(int, input().split()))
L = int(input())
c = list(map(int, input().split()))
Q = int(input())
X = list(map(int, input().split()))
# 配列X の最大値を取得
MX = max(X)
# a,b,c それぞれをソートし、X の最大値を超える値を除去
a.sort()
b.sort()
c.sort()
A = []
for i in a:
if i <= MX:
A.append(i)
else:
break
B = []
for i in b:
if i <= MX:
B.append(i)
else:
break
C = []
for i in c:
if i <= MX:
C.append(i)
else:
break
# すべての組み合わせを一意に集約
ST = set()
for x in A:
for y in B:
for z in C:
d = 0
d = x+y+z
if d <= MX:
ST.add(d)
# STの中から、X の値の有無をひとつずつ検証
for x in X:
if x in ST:
print("Yes")
else:
print("No")