AtCoder が提供しているABC(AtCoder Beginner Contest)295 のA問題をC++とPythonで解いてみました。ABC295は、2023年3月25日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Probably English(Difficulty : 15)
問題はリンク先をご覧ください。
与えられた文字列が特定の文字列か判定する問題です。AtCoder Problems による Difficulty は 15 でした。
解答案
問題を以下の方針で解きます。
- N と文字列 Wi を読み込む。
- それぞれの Wi が、”and”、”not”、”that”、”the”、”you” のどれかと一致するか確認する。
- ひとつでも一致していたら “Yes” を、それ以外の場合は “No” を出力する。
C++ プログラム例(ABC295A)
上で記述した方針に従います。
文字列 Wi が一致しているか if 文で確認しました(15-19行目)。以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<string> w(n);
for (int i = 0; i < n; ++i) {
cin >> w[i];
}
bool result = false;
for (int i = 0; i < n; ++i) {
if ((w[i] == "and")
||(w[i] == "not")
||(w[i] == "that")
||(w[i] == "the")
||(w[i] == "you")) {
result = true;
}
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
候補となる文字列を配列 a に格納して確認するプログラムも紹介します。このプログラムの方が、候補となる文字列が固まっているため、確認がしやすいと思います(13行目)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<string> w(n);
for (int i = 0; i < n; ++i) {
cin >> w[i];
}
vector<string> a = {"and", "not", "that", "the", "you"};
bool result = false;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < a.size(); ++j) {
if (w[i] == a[j]) {
result = true;
}
}
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC295A)
Python は、演算子 in で候補となる文字列のどれかと一致しているか判定できます(8行目)。すっきりとプログラムが表現できています。
"""AtCoder Beginner Contest 295 A"""
n = int(input())
w = list(input().split())
a = ["and", "not", "that", "the", "you"]
result = False
for i in range(n):
if w[i] in a:
result = True
print("Yes" if result else "No")
こちらも「AC」と判定されました。
最後に
この問題は与えられている5つの文字列をミススペルしたら、ACが取れないため、十分によく見てから提出することになります。
現実の製品開発では、5つのミススペルが検出できるようにテストケースを用意します。提出時間が重要な競プロでは、正確に目視確認ができることも必要なスキルだと思います。
引き続き ABC の問題を紹介していきます。