AtCoder

ABC311 A問題(First ABC)を解く

AtCoder_ABC311_A

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

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

A問題 First ABC(Difficulty : 16)

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

ABC311 A問題 First ABC

文字列を走査して条件を満たすか確認する問題です。AtCoder Problems による Difficulty は 16 でした。

解答案

C++ プログラム例(ABC311A)

文字 ‘A’、’B’、’C’ が含まれているか Bool 型の変数で管理します。その文字が現れた場合に真にします(13行目)。3つの変数が真になった場所が解答となります(14行目)。

文字列の添え字は0から始まり、問題の解答は1文字目からカウントするため1を加えています(15行目)。以下が、C++プログラムとなります。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	string s;
	cin >> s;

	vector<bool> result(3, false);
	for (int i = 0; i < n; ++i) {
		result[s[i] - 'A'] = true;
		if (result[0] && result[1] && result[2]) {
			cout << i + 1 << endl;
			return 0;
		}
	}

	return 0;
}

stiring クラスには、find というメソッドが用意されています。指定した文字列が含まれている場合、その先頭の場所を返します。

この問題の制約から、”A” と “B” と “C” が必ず含まれています。”A” と “B” と “C” の先頭の位置が分かれば、解答は1行で記述できます(11行目)。

find を使ったプログラムは、以下となります。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	string s;
	cin >> s;

	cout << max(max(s.find("A"), s.find("B")), s.find("C")) + 1 << endl;

	return 0;
}

どちらも AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC311A)

C++ と同じように文字 ‘A’、’B’、’C’ が含まれているか Bool 型の変数で管理します(7行目)。その後の処理も同じです。

"""AtCoder Beginner Contest 311 A"""
n = int(input())
s = input()

result = [False] * 3
for i, ch in enumerate(s):
    result[ord(ch) - ord('A')] = True
    if result[0] and result[1] and result[2]:
        print(i + 1)
        break

Python の find を使うプログラムは以下となります。すっきりと書けています。

"""AtCoder Beginner Contest 311 A"""
n = int(input())
s = input()

print(max(s.find('A'), s.find('B'), s.find('C')) + 1)

どちらも「AC」と判定されました。

最後に

5回連続でコンテストが支障なく開催されています。主催者のみなさまの工夫と努力に感謝です。

引き続き ABC の問題を紹介していきます。

COMMENT

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

CAPTCHA