Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の9_A問題をC++とPython で解いてみました。
ITP1 のトピック9では、文字列について学びます。「文字列処理の基礎を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(9_A: Finding a Word)
問題はリンク先をご覧ください。
与えられた一連の文字列から、特定の文字列をカウントする問題です。
解答案
C++ プログラム例(ITP1 9_A)
iostream では、空白を区切り文字と認識します。このため string 文字列も、空白を区切り文字として、読み込みます。
読み込んだ文字列が ”END_OF_TEXT” であれば、プログラムを抜けます(17-19行目)。
問題に「なお、大文字と小文字は区別しません。」と記述があるため、英字大文字であれば、英字小文字に変換しています(20-24行目)。
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string w;
cin >> w;
int answer = 0;
while (1) {
string s;
cin >> s;
if (s == "END_OF_TEXT") {
break;
}
for (int i = 0; i < s.length(); ++i) {
if (isupper(s[i])) {
s[i] = tolower(s[i]);
}
}
if (s == w) {
++answer;
}
}
cout << answer << endl;
return 0;
}
Python プログラム例(ITP1 9_A)
Python は、input 関数で1行読み込みます。split で分割して処理を行います。C++ の tolower は、文字に対しての処理ですが、Python の lower メソッドは、文字列に対しての処理であるため、簡単に書けています。
w = input()
answer = 0
while True:
t = input().split()
if t[0] == "END_OF_TEXT":
break
for word in t:
if w == word.lower():
answer += 1
print(answer)
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
トピック9では、トピック8で学んだ「文字」の応用的な話題を扱います。今回のプログラムも(簡単な)検索プログラムと言えます。応用範囲が広がってきました。
引き続き、ITP1 の問題を紹介していきます。