ABC416の感想戦
目次
AtCoder Beginner Contest 416に参加したが、前回にと同じくAとB問題しか正解できなかった。C問題を落としたのはとても痛いが、とりあえずAとB問題を振り返ります。
A - Vacation Validation
文字列\(S\)が与えられるので、指定範囲内がoだけであるかを答える問題。
考え方
指定の範囲内の文字をset()を使って分類し、oの1種類であることを確認する。
技術的工夫
pythonのset()は、文字列の集合を作ることができるが、set(String)とするとString型を分解して、文字列ではなく文字単位での集合となる。
set("LIST")
# {'S', 'T', 'L', 'I'}N, L, R = map(int, input().split())
S = input()
# set("LIST") resuls {'S', 'T', 'L', 'I'}
span = set(S[L-1:R])
if (len(span) == 1) and ('o' in span):
print("Yes")
else:
print("No")別の考え方
もっと単純に指定範囲の文字を順番に調べて、o以外がないことを確認しても良かった。
N, L, R = map(int, input().split())
S = input()
for i in range(L-1, R):
if S[i] != 'o':
print("No")
break
else:
print("Yes")B - 1D Akari
問題:B - 1D Akari
.と#で構成される文字列\(S\)が与えられる。これをルールに従ってoを置き、 oの数が最大となる文字列を答える問題。
考え方
ルールが何を意味しているか理解に時間がかかったが、サンプルを見て#で区切られた範囲に1つだけoを置けばよいのだと理解した。
そこで与えられた文字列\(S\)を#で分割し、.を1つだけoで置き換えることにした。そして最後にそれらの文字列を#で結合すれば良い。
理解
#で区切られた範囲に1つだけしかoを置けないルールを理解できなかったが、次のルールがそれを規定していた。
- \(T_i = T_j =\)
o\((i \lt j)\)の時、\(T_{i+1},\cdots,T_{j-1}\)の範囲に#が1つ以上存在する。
oを連続して置こうとするとは、\(j=i+1\)となり#が存在できなくなってしまう。そのためoを連続して置けない。
S = input()
T = []
for i in S.split("#"):
if i == '':
T.append('')
else:
T.append('o' + i[1:])
print("#".join(T))