AtCoder が提供しているABC(AtCoder Beginner Contest)291 のA問題をC++とPythonで解いてみました。ABC291は、2023年2月26日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 camel Case(Difficulty : 8)
問題はリンク先をご覧ください。
与えられた英字文字列から大文字を探す問題です。AtCoder Problems による Difficulty は 8 でした。
解答案
問題を以下の方針で解きます。
- 文字列 S を読み込む。
- 文字列 S の先頭文字から以下を繰り返す。
- 取り出した文字が大文字なら、文字の位置(先頭を1とする)を出力する。
C++ プログラム例(ABC291A)
大文字か判定するために標準ライブラリの関数 isupper を使います。この関数は、引数で与えられた文字が英字大文字である場合に限り true を返します。
C++ の配列(文字列含む)の添え字は0から始まります。一方、問題は文字列の先頭を1文字目としているため、添え字に1を加えて出力しています(10行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
for (int i = 0; i < s.length(); ++i) {
if (isupper(s[i])) {
cout << i + 1 << endl;
}
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC291A)
Python のリストも添え字は0から始まります。C++と同じように1を加えて出力しています(5行目)。また、isupper メソッドも用意されています。
文字列を for で走査するために range(len(s)) を使うこともできますが、pylint で警告されました。以下のプログラムのように enumerate を使うほうが、Python らしいプログラムになるようです(3行目)。
"""AtCoder Beginner Contest 291 A"""
s = input()
for i, ch in enumerate(s):
if ch.isupper():
print(i + 1)
こちらも「AC」と判定されました。
最後に
A問題としては標準的な難易度でしょうか。わたしは、isupper を スペルミスして isUpper と書いて、コンパイルに一度失敗しました。問題が、Camel Case を題材に使っていたので、記憶違いをしたようです。
引き続き ABC の問題を紹介していきます。