AtCoder が提供しているABC(AtCoder Beginner Contest)299 のA問題をC++とPythonで解いてみました。ABC299は、2023年4月22日21:00に実施されました。
この回は、外部からDDoS攻撃を受けてサーバが不安定になり unrated となりました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Treasure Chest
問題はリンク先をご覧ください。
与えられた文字列が条件を満たすか確認する問題です。AtCoder Problems による Difficulty は算出されていません。A問題としては通常の難易度だと思います。
解答案
ABC297B問題に似ていますが、この問題の方が条件が少ないため簡単です。
- 文字列の ‘|’ の最初の場所と2番目の場所を記憶する。
- 文字列の ‘*’ の場所を記憶する。
- ‘*’ が ‘|’ に囲まれている場合は、”Yes” と出力する。それ以外の場合は、”No” を出力する。
C++ プログラム例(ABC299A)
‘|’ の最初の場所を変数 in1 に、’*’ の場所を in2 に、 ‘|’ の2番目の場所を in3 に格納します(15-24行目)。in1 < in2 < in3 の関係になっているか判断して変数 result に格納して(27行目)、結果を出力します(29-33行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
int in1 = -1;
int in2;
int in3;
for (int i = 0; i < n; ++i) {
if (s[i] == '|') {
if (in1 == -1) {
in1 = i;
} else {
in3 = i;
}
}
if (s[i] == '*') {
in2 = i;
}
}
bool result = (in1 < in2)&&(in2 < in3);
if (result) {
cout << "in" << endl;
} else {
cout << "out" << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC299A)
C++のロジックをそのまま Python に書き直しました。Python は、大小の判定が chained-comparison な書き方ができるため簡潔になっています(15行目)。
"""AtCoder Beginner Contest 299 A"""
n = int(input())
s = input()
in1 = -1
for i, ch in enumerate(s):
if ch == '|':
if in1 == -1:
in1 = i
else:
in3 = i
if ch == '*':
in2 = i
result = in1 < in2 < in3
print("in" if result else "out")
こちらも「AC」と判定されました。
最後に
ABC299 は、2週続けて unrated となりました。運営の方も苦労されているかと思います。
引き続き ABC の問題を紹介していきます。