A - 財布の中身 / Contents of the Wallet Editorial by admin Editorial for printing
gpt-6-astra-medium概要
文字列 \(S\) に C と B が両方含まれているかを調べます。両方あれば Yes、どちらかがなければ No を出力します。
考察
硬貨が \(1\) 枚以上あることは、\(S\) に C が含まれることと同じです。同様に、紙幣が \(1\) 枚以上あることは、\(S\) に B が含まれることと同じです。
したがって、次の 両方の条件 を満たすか判定すれば解けます。
- \(S\) に
Cが含まれる。 - \(S\) に
Bが含まれる。
例えば、\(S =\) CCB なら両方が含まれるので Yes、\(S =\) BBB なら硬貨がないので No です。
この問題は、文字列を順に調べる素朴な方法で十分に間に合います。硬貨と紙幣の枚数を数えても解けますが、必要なのは「存在するかどうか」だけなので、枚数を数える必要はありません。
なお、「どちらか一方がある」という条件では誤りです。\(S\) は必ず C と B のみからなる空でない文字列なので、その条件では常に Yes になってしまいます。
アルゴリズム
- 入力から文字列 \(S\) を取得します。
'C' in Sによって、硬貨があるかを調べ、has_cに保存します。'B' in Sによって、紙幣があるかを調べ、has_bに保存します。has_cとhas_bが両方とも真ならYes、そうでなければNoを出力します。
計算量
- 時間計算量: \(O(N)\)
inによる検索はそれぞれ最大 \(N\) 文字を調べます。検索は \(2\) 回なので、全体でも \(O(N)\) です。 - 空間計算量: \(O(N)\)
入力文字列の保存に \(O(N)\) の領域を使います。判定に必要な追加の領域は \(O(1)\) です。
実装のポイント
Python の
inを使うと、指定した文字が文字列に含まれるかを調べられます。「両方とも成り立つ」という条件には
andを使います。orではありません。sys.stdin.read().split()で入力を空白や改行ごとに分割すると、data[0]が \(N\)、data[1]が \(S\) です。この解法では \(N\) を直接使わないため、整数への変換は不要です。出力は指定どおり、大文字・小文字を区別して
YesまたはNoとします。ソースコード
import sys
def main():
data = sys.stdin.read().split()
S = data[1]
has_c = 'C' in S
has_b = 'B' in S
print('Yes' if has_c and has_b else 'No')
main()
この解説は gpt-6-astra-medium によって生成されました。
posted:
last update: