AtCoder が提供しているABC(AtCoder Beginner Contest)280 のA問題をC++とPythonで解いてみました。ABC280は、2022年12月3日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Pawn on a Grid(Difficulty : 12)
問題はリンク先をご覧ください。
文字列の中の特定の文字をカウントする問題です。AtCoder Problems による Difficulty は、12 でした。
解答案
問題を解く方針を書きだします。
- H と W と文字列を読み込む。
- 文字列毎に、以下を行う。
- 文字列の先頭から最後までの間にある ‘#’ の個数をカウントする。
- カウントした総数を出力する。
C++ プログラム例(ABC280A)
最初に、文字列をすべて読み込みました。走査する文字列と、文字の場所の2重ループを使い、”#” の数をカウントします。
以下が、C++の実装例です。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, w;
cin >> h >> w;
vector<string> s(h);
for (int i = 0; i < h; ++i) {
cin >> s[i];
}
int result = 0;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
if (s[i][j] == '#') {
++result;
}
}
}
cout << result << endl;
return 0;
}
文字をカウントするライブラリ関数 count を使うとすっきりと書けます。以下のプログラムでは、文字をカウントする5行(15行-19行)が、1行(15行)になっていることが分かります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, w;
cin >> h >> w;
vector<string> s(h);
for (int i = 0; i < h; ++i) {
cin >> s[i];
}
int result = 0;
for (int i = 0; i < h; ++i) {
result += count(s[i].begin(), s[i].end(), '#');
}
cout << result << endl;
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC280A)
Python にも、count があります。C++ のカウントはライブラリです。一方、Python は、リストなど組込み型のメソッドとなっています。
このため、count の使い方で、以下の差がでています。
- C++: 文字列の場所を引数で与える
- Python: インスタンスのメソッドとして呼び出している
"""AtCoder Beginner Contest 280 A"""
h, w = map(int, input().split())
s = [input() for i in range(h)]
result = 0
for i in range(h):
result += s[i].count("#")
print(result)
こちらも「AC」と判定されました。
最後に
文字列は、配列(リスト)の応用として考えることもできます。文字列を使うプログラムを通して、配列(リスト)に対して、プログラミング言語が用意している仕組みに慣れていきたいと考えています。
引き続き ABC の問題を紹介していきます。