公式

A - 財布の中身 / Contents of the Wallet 解説 by admin

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 になってしまいます。

アルゴリズム

  1. 入力から文字列 \(S\) を取得します。
  2. 'C' in S によって、硬貨があるかを調べ、has_c に保存します。
  3. 'B' in S によって、紙幣があるかを調べ、has_b に保存します。
  4. 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 によって生成されました。