AtCoder が提供しているABC(AtCoder Beginner Contest)349 のB問題をC++とPythonで解いてみました。ABC349は、2024年4月13日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Commencement(Difficulty : 89)
問題はリンク先をご覧ください。
文字が出現する頻度を求めて、頻度別に該当する文字数を確認します。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 の問題を紹介していきます。