Official

A - Capitalized? Editorial by evima


初めての方へ:この問題は人生最初のプログラミングとしてはやや大変でしょう。難しく感じる場合は他の回の問題 A(例:ABC336A)を先に解くことを勧めます。いずれにせよ、標準入力・標準出力の扱い方は practice contest の問題 A を参照してください。


題意を再掲します。

  • 以下が成り立つか判定せよ:文字列 \(S\) の先頭の文字は英大文字であり、それ以外の文字はすべて英小文字である。

方針 1. for ループ

以下の処理を実装しましょう。なお、\(S\) の先頭の文字を \(0\) 文字目とします。

  1. 変数 \(\mathrm{ans}\) を宣言し、\(S\)\(0\) 文字目が大文字なら true、小文字なら false を代入する。
  2. \(i = 1, 2, \dots, |S| - 1\) のそれぞれについて以下を行う:
    • \(S\)\(i\) 文字目が大文字なら、\(\mathrm{ans}\) に false を代入する。
  3. \(\mathrm{ans}\) の値が true なら Yes、false なら No を出力する。

文字が大文字か小文字か判定するには、言語の標準ライブラリが使えます。C++ には isupper や islower という関数があり、他の言語にも似た名前の関数があるはずです。

以下に C++ での実装例を示します。

#include <cctype>
#include <iostream>
using namespace std;

int main() {
    string S;
    cin >> S;
    bool ans = isupper(S[0]);
    for (int i = 1; i < S.size(); ++i) {
        ans &= bool(islower(S[i]));
    }
    cout << (ans ? "Yes" : "No") << endl;
}

C++ での注意:isupper や islower が返す値は true や false ではありません。\(c\) が大文字のとき islower(\(c\)) は \(0\) 以外の何らかの整数を返し、isupper も同様です。この値を bool として扱う場合は、明示的に変換しないと思わぬ失敗が生じることがあります(上記コードの \(10\) 行目の変換を省略すると、&= でのビット演算が失敗します)。


方針 2. ライブラリ

言語によっては、正規表現ライブラリを使う手があります。以下は Python での実装例です。

import re

S = input()
print("Yes" if re.fullmatch("[A-Z][a-z]*", S) else "No")

また、文字列中の文字すべてが小文字であるか判定するライブラリ関数があるかもしれません。\(S\) から先頭の文字を除いたものにその関数を適用すれば、方針 1 の for ループの部分の代わりになります。

S = input()
print("Yes" if S[0].isupper() and (len(S) == 1 or S[1:].islower()) else "No")

Python での注意:isupper や islower は空文字列に対して False を返します。競技プログラミングでは余計なお世話です。今回は、 \(S\) の長さが \(1\) の場合を特別扱いしなければなりません。

さらに、今回の問題を一発で解くライブラリ関数があるかもしれません。

S = input()
print("Yes" if S.istitle() else "No")

posted:
last update: