AtCoder が提供しているABC(AtCoder Beginner Contest)393 B問題をC++とPythonで解いてみました。ABC393は、2025年2月15日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 A..B..C(Difficulty : 44)
問題の詳細は、リンク先をご覧ください。
文字の場所を格納して全探索しました。AtCoder Problems による Difficulty は 44 でした。
解答案
C++ プログラム例(ABC393B)
文字 ‘A’ の位置を配列 a
に、同じように 文字 ‘B’ の位置を b
に、文字 ‘C’ の位置を c
に格納します(9ー22行目)。
次に配列 a
、b
、c
の要素を全探索して、条件を満たす組み合わせをカウントします(24ー36行目)。
以下が、C++プログラムです。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
vector<int> a;
vector<int> b;
vector<int> c;
for (int i = 0; i < (int)s.length(); ++i) {
if (s[i] == 'A') {
a.push_back(i);
}
if (s[i] == 'B') {
b.push_back(i);
}
if (s[i] == 'C') {
c.push_back(i);
}
}
int result = 0;
for (int i = 0; i < (int)a.size(); ++i) {
for (int j = 0; j < (int)b.size(); ++j) {
for (int k = 0; k < (int)c.size(); ++k) {
if ((a[i] >= b[j]) || (b[j] >= c[k])) {
continue;
}
if (b[j] - a[i] == c[k] - b[j]) {
++result;
}
}
}
}
cout << result << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC393B)
Python版も基本的な考え方は同じです。以下がプログラムです。
"""AtCoder Beginner Contest 393 B"""
s = input()
a = []
b = []
c = []
for i, ch in enumerate(s):
if ch == 'A':
a.append(i)
elif ch == 'B':
b.append(i)
elif ch == 'C':
c.append(i)
result = 0
for i in a:
for j in b:
for k in c:
if i >= j or j >= k:
continue
if j - i == k - j:
result += 1
print(result)
こちらも「AC」と判定されました。
最後に
いくつかの解法がある問題のようです。わたしが分かりやすいと感じたプログラムを紹介しました。
引き続き ABC の問題を紹介していきます。