ABC416の感想戦

目次

AtCoder Beginner Contest 416に参加したが、前回にと同じくAとB問題しか正解できなかった。C問題を落としたのはとても痛いが、とりあえずAとB問題を振り返ります。


A - Vacation Validation

問題: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))