質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

543閲覧

【競プロ】(Python)ABC017-B問題のうち,1つのテストケースで不正解となる

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/05/02 16:57

前提・実現したいこと

取り組んでいた問題は**ABC017-B「choku語」**です.
テストケースのうち1つだけ不正解となるものがあるのですが,問題自体が古いためテストケースが公開されていません.
teratailで質問すればなぜ不正解となるのかが分かるのではないかと思い質問しました.

###問題文(見やすくするために一部改変しています)

####B - choku語
実行時間制限: 2 sec / メモリ制限: 256 MB

#####問題文

高橋君は、ある日不思議な生物を見た。

その生物は choku 語という言語を用いていることがわかった。

文字列S が以下の条件を満たしているときに S は choku 語であると定義する。

・文字列S が空文字列であるとき。 ・文字列S が、choku 語である文字列 T の末尾に ch をつけた文字列であるとき。 ・文字列S が、choku 語である文字列 T の末尾に o をつけた文字列であるとき。 ・文字列S が、choku 語である文字列 T の末尾に k をつけた文字列であるとき。 ・文字列S が、choku 語である文字列 T の末尾に u をつけた文字列であるとき。

choku 語の理解を深めるため、与えられた文字列が choku 語であるかを判定するプログラムを作成することにした。

#####入力

入力は以下の形式で標準入力から与えられる。

X

1行目には、choku 語か判定したい文字列 X(1≦|X|≦50)が与えられる。
Xは半角小文字アルファベットのみで構成されている。

#####出力
Xが choku 語なら文字列 YES を、そうでないなら文字列 NO を 1 行に出力せよ。出力の末尾にも改行を入れること。

発生している問題

テストケース「subtask1-39.txt」において不正解となる.

該当のコード

(当時僕は「replaceメソッドは第3引数を指定しない場合全ての該当部分を置換する」という仕様を知らず,whileループを用いて実装を行なっていました.)

python3

1X = input() 2beforeX = "" 3if X == "": 4 print('YES') 5 exit(0) 6while True: 7 X = X.replace("\n",'',1) 8 X = X.replace('ch','',1) 9 X = X.replace('o','',1) 10 X = X.replace('k','',1) 11 X = X.replace('u','',1) 12 if X == "": 13 print('YES') 14 exit(0) 15 elif X == beforeX: 16 print('NO') 17 exit(0) 18 else: 19 beforeX = X

試したこと

同じ問題を同じ解き方(replaceメソッドを用いて空文字に置換する方法)で正解している方を見つけたので,その方のコードを参照しました.しかし,自分の書いたコードと動作がどう違うのかわからず,結局何故自分のコードが不正解になったのかはわかりませんでした.

python3

1X = input() 2X = X.replace('ch', '') 3X = X.replace('o', '') 4X = X.replace('k', '') 5X = X.replace('u', '') 6if X == '': 7 print('YES') 8else: 9 print('NO')

補足情報(FW/ツールのバージョンなど)

  • Python3.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例えば、"coh"はchoku語ではありませんが、 "coh" -> "ch" -> "" と空文字列になり、choku語と判定されてしまいます。
一方で、一括でやってるコードのほうは、先にchを一括で置換しているので"coh"はchoku語と判定されません。

投稿2020/05/02 17:05

minaminao

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/02 17:24 編集

回答ありがとうございます. 無知なものでもう少し詳しく説明していただきたいです. ・上のコードでは最初のループで(replaceメソッドは先頭から置換するから)"ch"->""の置換は行われず,"o"->""の置換のみが行われる,ということでしょうか. ・また,replaceメソッドの判定についてもお聞きしたいです.  例)string s = coh    s = s.replace("ch","")    print(s)   と書いたとき,出力されるのは"o"でしょうか,それとも"coh"でしょうか.(replaceメソッドは対象の文字列が途切れ途切れになっていても置換するのでしょうか,とお聞きしたかったのですが伝わりにくい気がしたので例を出させていただきました)
minaminao

2020/05/02 17:22

> ・上のコードでは最初のループで(replaceメソッドは先頭から置換するから)"ch"->""の置換は行われず,"o"->""の置換のみが行われる,ということでしょうか. その通りです。1回目のループでcohはoのreplaceだけが行われてchになり、2回目のループでchのreplaceが行われ空文字列になります。 > 出力されるのは"o"でしょうか,それとも"coh"でしょうか coh です。replaceメソッドはcohのように途切れ途切れになっているものは置換しません。
退会済みユーザー

退会済みユーザー

2020/05/02 17:23

ありがとうございます. なんとなくモヤモヤしていたところも含めて知識をはっきり吸収することができたと思います. ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問