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 の問題を紹介していきます。