AtCoder が提供しているABC(AtCoder Beginner Contest)286 のB問題をC++とPythonで解いてみました。ABC286は、2023年1月21日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Cat(Difficulty : 32)
問題はリンク先をご覧ください。
与えられた文字列を変換する問題です。AtCoder Problems による Difficulty は 32 でした。
解答案
問題を解く方針を書きだします。
- N と文字列 S を読み込む。
- S の先頭から以下を行う。
- “na” の場合、”nya” を出力する。
- それ以外の文字は、そのまま出力する。
問題の見た目は異なりますが、プログラムは、ABC283 C問題と似ています。
C++ プログラム例(ABC286B)
方針に従い、プログラムしました。for 文の中で、ループカウンタ i の値をインクリメントしているのは、良くない作法です。ABC283 C問題でもこの問題でも許容することにしました。
なお、string 型の変数 str について、str[str.lentgh()] は、範囲外アクセスではないと定められています。このため、オーバーランアクセスは発生しません。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
for (int i = 0; i < s.length(); ++i) {
if ((s[i] == 'n')&&(s[i + 1] == 'a')) {
cout << "nya";
++i;
} else {
cout << s[i];
}
}
cout << endl;
return 0;
}
置換を行うライブラリを使ったプログラムも紹介します。複数回数の置換には、regex_replace を使います。以下は、この関数の使用例も示しています(11行目)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
cout << regex_replace(s, regex("na"), "nya") << endl;
return 0;
}
どちらもAC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC286B)
Python は、置換するプログラムだけ紹介します。replace メソッドを使いました。”na″ を “nya” に置換して、出力しているだけです。すっきりと書けています。
"""AtCoder Beginner Contest 286 B"""
n = int(input())
s = input()
print(s.replace("na", "nya"))
こちらも「AC」と判定されました。
最後に
文字列の処理については、ライブラリを使う方がプログラムがすっきりと書けることが分かりました。
引き続き ABC の問題を紹介していきます。