AIZU ONLINE JUDGE

AOJ ITP1 8_C(Counting Characters)を解く

AOJ_ITP1_8_C

Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の8_C問題をC++とPython で解いてみました。

ITP1 のトピック8では、文字について学びます。「プログラムで文字を扱う方法を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。

問題(8_C: Counting Characters)

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

AOJ ITP1 8_C問題:Counting Characters

与えられた文字列から英字の頻度をカウントする問題です。

解答案

C++ プログラム例(ITP1 8_C)

空白を含む行を読み込むため、iostream ではなく、stdio.h を使います。英字の頻度をカウントする配列 alpha を用意して、英字であれば小文字に変換して頻度を alpha に格納しています(13、17行目)。

#include <cstdio>
#include <cctype>

using namespace std;

int main()
{
	char ch;
	int alpha[26] = {};

	while (scanf("%c", &ch) != EOF) {
		if (isalpha(ch)) {
			++alpha[tolower(ch) - 'a'];
		}
	}
	for (int i = 0; i < 26; i++) {
		printf("%c : %d\n", i + 'a', alpha[i]);
	}

	return 0;
}

配列の代わりに map を使うと以下となります。map を使う方が、添え字がすっきりと書けています(14、18行目)。

#include <map>
#include <cstdio>
#include <cctype>

using namespace std;

int main()
{
	char ch;
	map<char, int> alpha;

	while (scanf("%c", &ch) != EOF) {
		if (isalpha(ch)) {
			++alpha[tolower(ch)];
		}
	}
	for (char ch = 'a'; ch <= 'z'; ++ch) {
		printf("%c : %d\n", ch, alpha[ch]);
	}

	return 0;
}

Python プログラム例(ITP1 8_C)

Python では、辞書(dict)を使います。ただし、値がない場合に dict はエラーになります。この場合も考慮して、defaultdict を使いました(1、11行目)。これは、C++ の map 版と同様に、すっきりと書けています。

入力の終端(End Of File)まで読むために、try – except を使っています。

また、英字小文字だけを含んだ文字列を参照するために string.lowercase を使いました(2、16行目)。

from collections import defaultdict
import string

s = ""
while True:
    try:
        s += input()
    except EOFError:
        break

alpha = defaultdict(int)
for i, ch in enumerate(s):
    if ch.isalpha():
        alpha[ch.lower()] += 1

for ch in string.ascii_lowercase:
    print(f"{ch} : {alpha[ch]}")

上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。

最後に

文字の頻度をカウントするために、C++ では、配列とmapを使いました。Python では、辞書(defaultdict)を使いました。

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

COMMENT

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

CAPTCHA