AtCoder

ABC393 B問題(A..B..C)を解く

AtCoder_ABC393_B

AtCoder が提供しているABC(AtCoder Beginner Contest)393 B問題をC++とPythonで解いてみました。ABC393は、2025年2月15日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 A..B..C(Difficulty : 44)

問題の詳細は、リンク先をご覧ください。

ABC393 B問題 A..B..C

文字の場所を格納して全探索しました。AtCoder Problems による Difficulty は 44 でした。

解答案

C++ プログラム例(ABC393B)

文字 ‘A’ の位置を配列 a に、同じように 文字 ‘B’ の位置を b に、文字 ‘C’ の位置を c に格納します(9ー22行目)。

次に配列 abc の要素を全探索して、条件を満たす組み合わせをカウントします(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 の問題を紹介していきます。

COMMENT

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

CAPTCHA