AtCoder が提供しているABC(AtCoder Beginner Contest)297 のC問題をC++とPythonで解いてみました。ABC297は、2023年4月9日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 PC on the Table(Difficulty : 96)
問題はリンク先をご覧ください。
与えられた文字列を置き換える問題です。AtCoder Problems による Difficulty は 96 でした。
解答案
問題を以下の方針で解きます。
- H と W、H 個の文字列 Si を読み込む。
- 各 Si の文字列 “TT” を “PC” に置き換えた文字列を出力する。
C++ プログラム例(ABC297C)
読み込んだ Si に対して、’T’ の次の文字が ‘T’ か調べています。どちらも ‘T’ の場合は、前の文字を ‘P’ に次の文字を ‘C’ に置き換えます(15から17行目)。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, w;
cin >> h >> w;
vector<string> s(h);
for (int i = 0; i < h; ++i) {
cin >> s[i];
}
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w - 1; ++j) {
if ((s[i][j] == 'T')&&(s[i][j + 1] == 'T')) {
s[i][j] = 'P';
s[i][j + 1] = 'C';
}
}
}
for (int i = 0; i < h; ++i) {
cout << s[i] << endl;
}
return 0;
}
置換を行うライブラリを使ったプログラムも紹介します。複数回数の置換には、regex_replace を使います。以下は、この関数の使用例も示しています(14行目)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, w;
cin >> h >> w;
vector<string> s(h);
for (int i = 0; i < h; ++i) {
cin >> s[i];
}
for (int i = 0; i < h; ++i) {
cout << regex_replace(s[i], regex("TT"), "PC") << endl;
}
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC297C)
Python は、関数 replace を使い置換しました(6行目)。
"""AtCoder Beginner Contest 297 C"""
h, w = map(int, input().split())
s = [input() for i in range(h)]
for i in range(h):
print(s[i].replace("TT", "PC"))
こちらも「AC」と判定されました。
最後に
文字列の置き換えは、ABC286 B問題でも使いました。ライブラリ関数を使う回数が増えて慣れてきました。
引き続き ABC の問題を紹介していきます。