東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 299)の解説記事です。
目次
ABC299 A – Treasure Chest
問題
問題文の要約は以下の通りです。
問題の要約
|
が2個、*
が1個、残りは.
からなる長さ \(N\) の文字列を与えたとき、|
の間に*
が含まれているか判定せよ。
解説1
前から順に文字の種類を一文字ずつ確認する。
解説
前から順に文字の種類が|
、*
、|
であるか順番に判定する。
解答
N = int(input())
S = input()
#前から順に確認する
for i in range (N):
# | であるか?
if S[i]=='|':
# | 以降の文字を順番に確認する
for j in range (i+1,N,1):
# * であるか?
if S[j]=='*':
# * 以降の文字を順番に確認する
for k in range (j+1,N,1):
# | であるか?
if S[k]=='|':
print('in')
exit()
print('out')
解説2
文字の種類の位置が条件を満たすか判定する。
解説
|
、*
、|
の文字の位置を判定します。位置はS.index('文字')
で判定できます。index
は左からの場所なので右からの場所を取得するためにはS.rindex('文字')
を用います。
条件はS.index('|') < S.index('*') < S.rindex('|')
と書くことができます。
解答
N = int(input())
S = input()
if S.index('|') < S.index('*') < S.rindex('|'):
print('in')
else:
print('out')
解説3
考える必要のない文字.
を取り除く。
解説
Sの.
を''
に置換して|*|
に一致するか確認する。
置換するにはS = replace('.', '')
を用います。
解答
N = int(input())
S = input()
if S.replace('.', '') == '|*|':
print('in')
else:
print('out')
解説4
正規パターンにあてはまるか確認する。
解説
|
、*
、|
の順番に文字列が当てはまるかどうかは以下のように考えることができます。
|
の後ろにいくつかの文字があった後に*
があり、その後ろにいくつかの文字があった後に|
が見つかればよいです。いくつかの文字は0 文字以上の任意の文字のことなので.*
と書くことができます。また、|
、*
は特殊文のため、エスケープが必要なので\|
、\*
と書くことができます。
したがって、\|
、.*
、\*
、.*
、\|
と書けます。
正規表現にマッチするか判定するにはre.search
を使用します。
解答
import re
N = int(input())
S = input()
if re.search('\|.*\*.*\|', S):
print('in')
else:
print('out')