AtCoder が提供しているABC(AtCoder Beginner Contest)297 のB問題をC++とPythonで解いてみました。ABC297は、2023年4月9日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 chess960(Difficulty : 47)
問題はリンク先をご覧ください。
与えられた文字列が条件を満たすか確認する問題です。AtCoder Problems による Difficulty は 47 でした。
解答案
C++ プログラム例(ABC297B)
文字列から文字の位置を以下の変数に代入します。
- 変数 b1: 1文字目の B の位置
- 変数 b2: 2文字目の B の位置
- 変数 r1: 1文字目の R の位置
- 変数 r2: 2文字目の R の位置
- 変数 k: 文字 K の位置
上記の文字の位置が分かったら、問題に示されている以下の条件を確認します。
- b1 と b2 の偶奇が異なる。これは、b2 – b1 が奇数であることを確認する。
- r1 < k < r2 であることを確認する。
プログラムでは、上記の条件の否定が成立していれば、変数 result を false にしています(35、38行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int b1 = -1;
int b2;
int r1 = -1;
int r2;
int k;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == 'B') {
if (b1 == -1) {
b1 = i;
} else {
b2 = i;
}
}
if (s[i] == 'R') {
if (r1 == -1) {
r1 = i;
} else {
r2 = i;
}
}
if (s[i] == 'K') {
k = i;
}
}
bool result = true;
if ((b1 - b2)% 2 == 0) {
result = false;
}
if ((k <= r1)||(r2 <= k)) {
result = false;
}
if (result) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC297B)
Python 版でも、文字の位置を変数 b1、b2、r1、r2、k に格納して、後でまとめて条件を満たすか確認しました。
"""AtCoder Beginner Contest 297 B"""
s = input()
b1 = -1
r1 = -1
for i, ch in enumerate(s):
if ch == 'B':
if b1 == -1:
b1 = i
else:
b2 = i
if ch == 'R':
if r1 == -1:
r1 = i
else:
r2 = i
if ch == 'K':
k = i
result = True
if (b1 - b2) % 2 == 0:
result = False
if k <= r1 or r2 <= k:
result = False
print("Yes" if result else "No")
こちらも「AC」と判定されました。
最後に
1文字毎に文字の場所を取得して、あとでまとめて条件を確認しました。ライブラリ関数を使えば、もっとすっきり書けるかもしれません。
引き続き ABC の問題を紹介していきます。