AtCoder

ABC291 A問題(camel Case)を解く

AtCoder_ABC291_A

AtCoder が提供しているABC(AtCoder Beginner Contest)291 のA問題をC++とPythonで解いてみました。ABC291は、2023年2月26日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

A問題 camel Case(Difficulty : 8)

問題はリンク先をご覧ください。

ABC291 A問題 camel Case

与えられた英字文字列から大文字を探す問題です。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 を題材に使っていたので、記憶違いをしたようです。

ABC291 について、引き続き、E問題まで紹介します。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA