AtCoder

ABC357 B問題(Uppercase and Lowercase)を解く

AtCoder_ABC357_B

AtCoder が提供しているABC(AtCoder Beginner Contest)357 B問題をC++とPythonで解いてみました。ABC357は、2024年6月8日21:00に実施されました。

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

B問題 Uppercase and Lowercase(Difficulty : 26)

問題の詳細は、リンク先をご覧ください。

ABC357 B問題 Uppercase and Lowercase

文字を処理する標準ライブラリを使います。AtCoder Problems による Difficulty は 26 でした。

解答案

C++ プログラム例(ABC357B)

以下の標準ライブラリを使います。これらはC言語の標準ライブラリ由来となります。このため、クラスメソッドではなく、関数として呼び出します。

  • int islower(int c) : c が英字小文字であれば0以外、それ以外であれば0を返します。C言語由来のため、bool 型ではなく、0または0以外を返すことに注意が必要です。
  • int tolower(int c) : c が英字大文字の場合に英字小文字に変換した文字コードを返します。英字大文字でなければ、c をそのまま返します。
  • int toupper(int c) : c が英字小文字の場合に英字大文字に変換した文字コードを返します。英字小文字でなければ、c をそのまま返します。

文字列を走査して、islower で英字小文字の数をカウントします。英字小文字の数が多ければ、文字列を tolower で英字小文字に変換します。そうでなければ toupper で英字大文字に変換します。

以下が、C++プログラムとなります。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin >> s;

	int size = s.length();
	int n_lower = 0;
	for (int i = 0; i < size; ++i) {
		if (islower(s[i])) {
			++n_lower;
		}
	}
	if (n_lower > size / 2) {
		for (int i = 0; i < size; ++i) {
			s[i] = tolower(s[i]);
		}
	} else {
		for (int i = 0; i < size; ++i) {
			s[i] = toupper(s[i]);
		}
	}

	cout << s << endl;

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC357B)

Pythonでは、文字列型のメソッドとして islower を使用します。英字を変換するメソッド名も lower と upper になっています。これらは文字列に対して作用します。以下が Python プログラムです。

"""AtCoder Beginner Contest 357 B"""
s = input()

size = len(s)
n_lower = 0
for ch in s:
    if ch.islower():
        n_lower += 1
if n_lower > size // 2:
    s = s.lower()
else:
    s = s.upper()

print(s)

こちらも「AC」と判定されました。

最後に

紹介した C++標準ライブラリ関数は、C言語由来のため、今となっては使い勝手に違和感があります。その点で Python 版の方が、自然に書けています。

引き続き ABC の問題を紹介していきます。

COMMENT

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

CAPTCHA