【ABC049C - 白昼夢】Pythonメモ1-5
ABC049C - 白昼夢 を解く。(カンニングして)
■■■第一に、解き方の方針すら立たないし、他の方の方針を参考にしたところで文法知識が無いし、コードすら書けないし。。。ということでカンニングしました。■■■
・まず得られた文法知識は x.replace("X","Y")
・前半について、x に文字列 "abc" や文字列 x =str(input()) (基本は input() でよいはず) を代入し、後半の ("X","Y") は文字列 X を 文字列 Y に変えるという操作を行うもの。
▼基本的な使い方について
1.文字列を置換する。(自動で操作を繰り返すぞ!)
- kirei = "unchiunchiunchi"
print(kirei.replace("chi","ko")) ⇒ unkounkounko - kitanai = "At to ma k e Ha H o m o"
print(kitanai.replace(" ","")) ⇒ AttomakeHaHomo - kitanai = "At to ma k e Ha H o m o"
print(kitanai.replace(" ","").replace("H"," H")) ⇒ Attomake Ha Homo
2.最大置換回数を指定する。("文字列x","文字列y",指定回数)
- print("aiueo".replace("a","unchi").replace("i","unchi").replace("u","unchi").replace("e","unchi").replace("o","unchi"))
- ⇒ unchinchunchinchiunchinchiunchiunchiunchi
print("aiueo".replace("a","unchi",1).replace("i","unchi",1).replace("u","unchi",1).replace("e","unchi",1).replace("o","unchi",1))- ⇒ unchinchunchiiuunchiunchi
3.複数の文字列を置換する。(左から文字列が適合すれば置換する。前半は AAXAX の並びに、後半は BXBXBX の並びの差異に注目。
- print("aaabbb".replace("aa","AAX").replace("a","AX").replace("b","BX").replace("bb","BBX"))
- ⇒ AAXAXBXBXBX
4.文字列を交換(スワップ)する。(交換する際は、予め別の文字列 X,Y などに入れておき、最後に X→x ,Y→y などと置換するとよい。(defで定義も可だが、数が多いとめんどくさい)
- a="kitanai Attomake ha"
print(a.replace("kitanai","Attomake").replace("Attomake","ha").replace("ha","kitanai")) - ⇒ kitanai kitanai kitanai
- a="kitanai Attomake ha"
print(a.replace("kitanai","X").replace("Attomake","Y").replace("ha","kitanai").replace("X","Attomake").replace("Y","ha")) - ⇒ Attomake ha kitanai
5.改行変数を文字列に置換する。
- a="Attomake\nha\nkirei"
print(a) - # Attomake
# ha
# kirei
print(a.replace("\n"," ")+" dayo")- ⇒ Attomake ha kirei dayo
・これらの知識を用いて解いていくぞ!(ACコードをチラ見はしたが、ここから自力で考える)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・まず、問題なのは dreamer と dream、どっちを replace で消しますか?問題。
・正直これぐらいなら dreamer と即答できるだろう。
・同様に、eraser, erase なら eraser を replaceで消す発想が即浮かぶだろう。
・ということは、eraser, erase の順に replace を、reamer, dream の順に replace を用いればよいことがわかった。
■■■だが、eraser と dreamer のどっちを先に replace を用いればよいだろうか?■■■
・その答えは eraser から。dream に erase/eraser が続くと dreamer- 扱いになるからだ。
erase/eraser に dream/dreamer が続いても先頭に d が付くので判別がつく。
故に eraser, erase, dreamer, dream の順で replace で消していけばよいことがわかる。
・さて、条件をみたす dreamer, dream, eraser, erase からなる文字列が与えられたら0文字に収めることが可能だということに着目すると、最終的に与えられる文字列の長さは0になる。
・すなわち、与えられた文字列 S が条件を満たすならば、len(S) = 0 ならば Yes を、そうでないなら No を答えればよい!
▼ということでコードを書く。
- s=input()
print("YES" if len(s.replace("eraser","").replace("erase","").replace("dreamer","").replace("dream",""))==0 else "NO")
Submission #24809066 - AtCoder Beginners Selection
▼一行で書けたわ^^;
- print("YES" if len(input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream",""))==0 else "NO")
Submission #24809296 - AtCoder Beginners Selection
・もっと文法知識を増やして典型的な解き方などを学ぶ必要があると思うので、もっともっとカンニングして勉強したいと思います。
・ABC086C - Travelingが解け次第、またメモを作りたい。