[Atcoder]ABC049C – 白昼夢 / Daydream[Ruby]

プログラミング

問題

英小文字からなる文字列Sが与えられます。Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことでS=Tとすることができるか判定してください。

  • Tの末尾に dream dreamer erase eraser のいずれかを追加する。

入出力例

入力例1
erasedream
出力例1
YES
erase,dreamの順でTの末尾に追加することで 
S=T とすることができます。

入力例2
dreameraser
出力例2
YES
dream,eraserの順で追加することで 
S=Tとすることができます。

入力例3
dreamerer
出力例3
NO

自分の回答

def daydream(words)
  words = words.gsub(/eraser/,"").gsub(/erase/,"").gsub(/dreamer/,"").gsub(/dream/,"")
  puts words.length == 0 ? "YES" : 'NO'
end

words = gets.chomp.to_s
daydream(words)

正直、問題文が何を言おうとしているのか、理解するのが難しかったです。考え方としては、とりあえず、与えられた単語にdream dreamer erase eraserが含まれていたら、取り除いていき、きれいにすべての文字が取り除けたらYESと出力すればいいです。

問題なのは、単語の取り除く順番です。”dreamer”という単語の中に”er”という部分が入っているので、先に”dreamer”という単語を排除してしまうと、本来”erase”として抜き出せるのに、”ase”となって抜き出せなくなってしまいます。なので、”eraser”、”erase”から抜き出します。

例
dreameraser
=> dreamerを取り除くとaserとなり、答えはNOとなるが、これは不正解

dreameraser
=> eraserを取り除くとdreamerが残り、dreamerを取り除いて、答えはYESとなる

参考リンク

タイトルとURLをコピーしました