AtCoder が提供しているABC(AtCoder Beginner Contest)311 のA問題をC++とPythonで解いてみました。ABC311は、2023年7月22日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 First ABC(Difficulty : 16)
問題はリンク先をご覧ください。
文字列を走査して条件を満たすか確認する問題です。AtCoder Problems による Difficulty は 16 でした。
解答案
C++ プログラム例(ABC311A)
文字 ‘A’、’B’、’C’ が含まれているか Bool 型の変数で管理します。その文字が現れた場合に真にします(13行目)。3つの変数が真になった場所が解答となります(14行目)。
文字列の添え字は0から始まり、問題の解答は1文字目からカウントするため1を加えています(15行目)。以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
vector<bool> result(3, false);
for (int i = 0; i < n; ++i) {
result[s[i] - 'A'] = true;
if (result[0] && result[1] && result[2]) {
cout << i + 1 << endl;
return 0;
}
}
return 0;
}
stiring クラスには、find というメソッドが用意されています。指定した文字列が含まれている場合、その先頭の場所を返します。
この問題の制約から、”A” と “B” と “C” が必ず含まれています。”A” と “B” と “C” の先頭の位置が分かれば、解答は1行で記述できます(11行目)。
find を使ったプログラムは、以下となります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
cout << max(max(s.find("A"), s.find("B")), s.find("C")) + 1 << endl;
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC311A)
C++ と同じように文字 ‘A’、’B’、’C’ が含まれているか Bool 型の変数で管理します(7行目)。その後の処理も同じです。
"""AtCoder Beginner Contest 311 A"""
n = int(input())
s = input()
result = [False] * 3
for i, ch in enumerate(s):
result[ord(ch) - ord('A')] = True
if result[0] and result[1] and result[2]:
print(i + 1)
break
Python の find を使うプログラムは以下となります。すっきりと書けています。
"""AtCoder Beginner Contest 311 A"""
n = int(input())
s = input()
print(max(s.find('A'), s.find('B'), s.find('C')) + 1)
どちらも「AC」と判定されました。
最後に
5回連続でコンテストが支障なく開催されています。主催者のみなさまの工夫と努力に感謝です。
引き続き ABC の問題を紹介していきます。