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))