AtCoder

ABC349 B問題(Commencement)を解く

AtCoder_ABC349_B

AtCoder が提供しているABC(AtCoder Beginner Contest)349 のB問題をC++とPythonで解いてみました。ABC349は、2024年4月13日21:00に実施されました。

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

B問題 Commencement(Difficulty : 89)

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

ABC349 B問題 Commencement

文字が出現する頻度を求めて、頻度別に該当する文字数を確認します。AtCoder Problems による Difficulty は 89 でした。

解答案

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

プログラムの補足説明です。

  • 英字小文字の出現頻度をカウントします(9ー12行目)。
  • 頻度別の配列(num)に文字の頻度を格納します(14-17行目)。
  • それぞれの文字の頻度が0または2になっているか確認します(19ー24行目)。

以下が、C++のプログラムです。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin >> s;

	vector<int> alpha(26);
	for (int i = 0; i < s.length(); ++i) {
		++alpha[s[i] - 'a'];
	}

	vector<int> num(s.length() + 1);
	for (int i = 0; i < 26; ++i) {
		++num[alpha[i]];
	}

	bool result = true;
	for (int i = 1; i < num.size(); ++i) {
		if ((num[i] != 0)&&(num[i] != 2)) {
			result = false;
		}
	}

	if (result) {
		cout << "Yes" << endl;
	} else {
		cout << "No" << endl;
	}

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC349B)

Python 版も基本的な考え方は同じです。以下となります。

"""AtCoder Beginner Contest 349 B"""
s = input()
alpha = [0] * 26
for ch in s:
    alpha[ord(ch) - ord('a')] += 1

num = [0] * (len(s) + 1)
for i in range(26):
    num[alpha[i]] += 1

result = True
for i in range(1, len(num)):
    if num[i] != 0 and num[i] != 2:
        result = False

print("Yes" if result else "No")

こちらも「AC」と判定されました。

最後に

英字の頻度をカウントするという前準備を行うことで、プログラムをすっきりと書くことができました。

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

COMMENT

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

CAPTCHA