yutasの競技プログラミング勉強帖

競技プログラミングの問題についての解説記事を主に書いています。

A - Capitalized? / AtCoder Beginner Contest 338

問題

英大文字・英小文字からなる空でない文字列  s が与えられる。 この  s が以下の条件を満たしているか判定せよ。

  •  s の先頭の文字は大文字であり、それ以外の文字はすべて小文字である。

入力

1行に、文字列  s が与えられる。

条件

  • 実行時間制限: 2s
  • メモリ制限: 1024MB
  •  1 \leq | s | \leq 100
  •  s の各文字は英大文字または英小文字である。

出力

条件が満たされていれば Yes を、そうでなければ No を出力すること。

解法

文字列  s のうち、「 s[0] にあたる部分が大文字かつ、それ以外の部分はすべて小文字」という条件を満たしているかを、  s の先頭から順番に各文字を見ていくことによって、この問題を解くことができます。

ここで、 s[0] が大文字かどうかの判定について C++ では 'A' <= s[0] && s[0] <= 'Z' の条件式によって行えます。 同様に、 s[i] が小文字かどうかの判定については 'a' <= s[i] && s[i] <= 'z' によって行えます。

以上を用いることによって、  O(|s|) の計算量で条件を満たすか否かの判定を行えます。

ソースコード

main() 関数の中に、答えを出力する部分を直接実装しました。

int main() {
  // 値の入力
  string s;
  cin >> s;

  bool flag = true; // flag は true のときに条件を満たし、 false のときに条件を満たさない

  if ('A' <= s[0] && s[0] <= 'Z') {
    // 先頭から2番目の文字から順番に、小文字かどうかを見ていく
    for (int i = 1; i < s.length(); i++) {
      if (!('a' <= s[i] && s[i] <= 'z')) {
        flag = false; // s[i] が小文字でないときは flag を false にする
      }
    }
  } else {
    flag = false; // 先頭が大文字でないときは flag を false にする
  }

  // 答えの出力
  if (flag) {
    Yes();
  } else {
    No();
  }

  return 0;
}