AtCoder が提供しているABC(AtCoder Beginner Contest)274 のB問題をC++とPythonで解いてみました。ABC274は、2022年10月22日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Line Sensor(Difficulty : 48)
問題はリンク先をご覧ください。
ある条件に従い、数字の頻度をカウントする問題です。AtCoder Problems による Difficulty は、48 でした。
解答案
問題を解く方針を書きだします。
- H と W を読み込み、H 個の文字列を読み込む。
- 読み込んだ長さ W の文字列に対して、’#’ がある場所のカウンターを増やす。
- 最後に、それぞれの場所にあった ‘#’ の個数を出力する。
C++ プログラム例(ABC274B)
制約から $1 \leqq W \leqq 1000$ であるため、要素をW個持つ vector コンテナを定義します。’#’ が登場する回数を記録して出力します。以下が、解答例です。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, w;
cin >> h >> w;
vector<int> m(w, 0);
for (int i = 0; i < h; ++i) {
string s;
cin >> s;
for (int j = 0; j < w; ++j) {
if (s[j] == '#') {
++m[j];
}
}
}
for (int j = 0; j < w; ++j) {
if (j != 0) {
cout << " ";
}
cout << m[j];
}
cout << endl;
return 0;
}
出力では、それぞれの数字の間に半角スペースを1個入れる必要があります。
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC274B)
Python では vector の代わりにリストを使います。C++ 版のプログラムを置き換えただけなので、あまり Python らしいプログラムではないかもしれません。
出力は、C++ より楽で、リスト変数に ‘*’ を付けることで、想定した出力を得ることができました。
"""AtCoder Beginner Contest 274 B"""
h, w = map(int, input().split())
m = [0] * w
for i in range(h):
s = input()
for j in range(w):
if s[j] == "#":
m[j] += 1
print(*m)
こちらも「AC」と判定されました。
最後に
B問題として、よく出題されるタイプの問題です。このような問題を素早く解けるようになっていくと、レートが上がっていくと思われます。
引き続き ABC の問題を紹介していきます。