考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

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" のときのチェック処理のせいでやたら長いコードになってしまった

もっと短く書ければいいのだけれど

 

提出結果はACでした