AtCoder

ABC297 B問題(chess960)を解く

AtCoder_ABC297_B

AtCoder が提供しているABC(AtCoder Beginner Contest)297 のB問題をC++とPythonで解いてみました。ABC297は、2023年4月9日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 chess960(Difficulty : 47)

問題はリンク先をご覧ください。

ABC297 B問題 chess960

与えられた文字列が条件を満たすか確認する問題です。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文字毎に文字の場所を取得して、あとでまとめて条件を確認しました。ライブラリ関数を使えば、もっとすっきり書けるかもしれません。

ABC297 について、引き続き、E問題まで紹介します。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA