AtCoder

ABC299 A問題(Treasure Chest)を解く

AtCoder_ABC299_A

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

この回は、外部からDDoS攻撃を受けてサーバが不安定になり unrated となりました。

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

A問題 Treasure Chest

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

ABC299 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 となりました。運営の方も苦労されているかと思います。

ABC299 について、引き続き問題を紹介していきます。

COMMENT

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

CAPTCHA