AtCoder が提供しているABC(AtCoder Beginner Contest)283 のC問題をC++とPythonで解いてみました。ABC283は、2022年12月24日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 Cash Register(Difficulty : 88)
問題はリンク先をご覧ください。
制約がある文字列の長さを求める問題です。AtCoder Problems による Difficulty は、88 でした。
解答案
レジの操作から、00 を1文字とカウントする。それ以外の数字は、そのまま1文字とカウントすれば良いことが分かります。
問題を解く方針を書きだします。
- 文字列 S を読み込む。
- 文字列 S が “00” を何個含むかカウントする。
- 文字列の長さから、”00″ の個数を引いて出力する。
C++ プログラム例(ABC283C)
方針に従い、プログラムしました。for 文の中で、ループカウンタ i の値をインクリメントしているのは、良くない作法ですが、今回は許容しました。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int temp = 0;
for (int i = 0; i < s.length(); ++i) {
if ((s[i] == '0')&&(s[i + 1] == '0')) {
++temp;
++i;
}
}
cout << s.length() - temp << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC283C)
Python は、文字列を置換する replace メソッドを使いました。”00″ を “Z” という1文字に置換して、文字列の長さを求めました。
"""AtCoder Beginner Contest 283 C"""
s = input()
print(len(s.replace("00", "Z")))
こちらも「AC」と判定されました。
最後に
一見、整数の処理をする問題と読み取れますが、実際は、文字列処理の問題でした。
引き続き ABC の問題を紹介していきます。