ABC017-B - choku語 を解く
ABC017-B - choku語
choku語 なる独自のルールを満たす文字列であるかを判定する問題
なんだか難しそう
【定義】
・空文字列はchoku語
・choku語の末尾に "ch" をつけた文字列もchoku語
・choku語の末尾に "o" をつけた文字列もchoku語
・choku語の末尾に "k" をつけた文字列もchoku語
・choku語の末尾に "u" をつけた文字列もchoku語
2個目の "ch" をつけるパターンが面倒だな
これがなければ前から一字ずつ見ていくだけでよかったのに
一字ずつ見ていくことの何がいけないのかというと
たとえば "c","h","o","k","u" であればOK、他の文字の場合はNG
としてしまうと、"oukcchk" なども通ってしまう("c" や "h" の連続は×)
"c" と "h" のときだけは前後関係を確認する必要がある
具体的には
・"c" の後ろに "h" が続いていればOK、そうでなければNG
・"h" の前に "c" があればOK、そうでなければNG
といった感じか
また、先頭や末尾の文字のときにこれらのチェックをしようとすると
参照外エラーを起こす可能性があるので注意したい
提出したコード
# 入力 X=input() # 文字列の長さを取得 le=len(X) for i in range(le): # 'o','k','u'の場合はOK if X[i] in 'oku': pass # 'c'の場合 elif X[i]=='c': # 文字列末尾ならNG if i==le-1: print('NO') exit() # 後ろに続く文字が'h'ならOK elif X[i+1]=='h': pass # それ以外ならNG else: print('NO') exit() # 'h'の場合 elif X[i]=='h': # 文字列先頭ならNG if i==0: print('NO') exit() # 前の文字が'c'ならOK elif X[i-1]=='c': pass # それ以外ならNG else: print('NO') exit() # それ以外ならNG else: print('NO') exit() # チェックに引っかからず検査を終えたら"YES"を出力 print('YES')
"c" と "h" のときのチェック処理のせいでやたら長いコードになってしまった
もっと短く書ければいいのだけれど