AtCoder

ABC342 A問題(Yay!)を解く

AtCoder_ABC342_A

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

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

A問題 Yay!(Difficulty : 31)

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

ABC342 A問題 Yay!

文字の頻度をカウントして処理します。AtCoder Problems による Difficulty は 31 でした。

解答案

隣接する文字が一致するか確認する方法では、最初の文字が対象になる場合(入力例2)など、条件分岐が複雑になると感じました。

このため、文字の頻度をカウントして解きました。

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

プログラムの補足です。

  • 文字の頻度を配列 alpha に格納します(9ー12行目)。
  • 文字の頻度が1である文字を target に記憶します(16ー17行目)。
  • 文字列 s を走査して、target と一致する文字のインデックスを出力します(21ー23行目)。

以下が、C++プログラムとなります。

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

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

	vector<int> alpha(26, 0);
	for (int i = 0; i < s.length(); ++i) {
		++alpha[s[i] - 'a'];
	}

	char target;
	for (int i = 0; i < 26; ++i) {
		if (alpha[i] == 1) {
			target = i + 'a';
			break;
		}
	}
	for (int i = 0; i < s.length(); ++i) {
		if (s[i] == target) {
			cout << i + 1 << endl;
		}
	}

	return 0;
}

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

Python プログラム例(ABC342A)

Python 版も基本的な考え方は同じです。以下となります。

"""AtCoder Beginner Contest 342 A"""
s = input()
alpha = [0] * 26

for _, ch in enumerate(s):
    alpha[ord(ch) - ord('a')] += 1

for i in range(26):
    if alpha[i] == 1:
        target = chr(i + ord('a'))

for i, ch in enumerate(s):
    if ch == target:
        result = i + 1

print(result)

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

最後に

今回のA問題は、配点が150点でした。普段のコンテスト(100点)より多めに配点されていました。A問題としては、少し難しいでしょうか。

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

COMMENT

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

CAPTCHA