公式
A - 財布の中身 / Contents of the Wallet 解説 by admin
gpt-6-astra-medium概要
文字列 \(S\) に、硬貨を表す C と紙幣を表す B が両方含まれているかを判定します。硬貨の枚数を数えることで判定できます。
考察
硬貨の枚数を \(\mathrm{coins}\) とします。お金は硬貨か紙幣のどちらかなので、紙幣の枚数は \(N-\mathrm{coins}\) です。
硬貨と紙幣が両方とも \(1\) 枚以上ある条件は、 - 硬貨がある:\(\mathrm{coins}>0\) - 紙幣がある:\(\mathrm{coins}<N\)
の両方が成り立つことです。つまり、\(0<\mathrm{coins}<N\) なら Yes になります。
例えば、\(N=4\)、\(S=\) CCBC なら硬貨は \(3\) 枚です。\(0<3<4\) を満たすため、Yes を出力します。一方、CCCC なら硬貨は \(4\) 枚で、紙幣がないため No です。
この問題では、文字列を先頭から順に調べる素朴な方法で十分に間に合います。ただし、「C が含まれているか」だけを確認すると、すべて硬貨の場合にも Yes としてしまいます。必ず紙幣の存在も確認しましょう。
アルゴリズム
- \(N\) と \(S\) を読み込みます。
- 硬貨の枚数を表す変数
coinsを \(0\) にします。 - \(S\) の各文字を調べ、
Cならcoinsを \(1\) 増やします。 coins > 0かつcoins < nならYes、そうでなければNoを出力します。
計算量
- 時間計算量: \(O(N)\)
文字列の各文字を \(1\) 回ずつ調べます。 - 空間計算量: \(O(N)\)
入力文字列 \(S\) の保存に必要です。入力の保存領域を除く追加の空間計算量は \(O(1)\) です。
実装のポイント
提示コードは C++ です。
&&を使うことで、硬貨と紙幣があるという \(2\) つの条件を同時に確認しています。coins == 0はすべて紙幣、coins == nはすべて硬貨の場合なので、どちらもNoです。\(N=1\) のときは両方のお金を持つことができません。この場合も同じ条件式で正しく
Noになります。ソースコード
// 問題文から独立に実装: 硬貨の枚数が 0 でも N でもないなら両方ある
#include <iostream>
#include <string>
int main() {
int n; std::string s; std::cin >> n >> s;
int coins = 0;
for (int i = 0; i < n; ++i) if (s[i] == 'C') coins++;
std::cout << ((coins > 0 && coins < n) ? "Yes" : "No") << std::endl;
}
この解説は gpt-6-astra-medium によって生成されました。