AtCoder が提供しているABC(AtCoder Beginner Contest)290 のB問題をC++とPythonで解いてみました。ABC290は、2023年2月19日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Qual B(Difficulty : 22)
問題はリンク先をご覧ください。
問題に従い文字列を書き換える問題です。AtCoder Problems による Difficulty は 22 でした。
解答案
問題文を読むと、与えられた文字列を以下のように書き換えれば良いことが分かります。
- ‘o’ が K 個現れるまでは、’x’ と ‘o’ をそのままコピーする。
- ‘o’ が K 個現れた以降は、文字をすべて ‘x’ としてコピーする。
C++ プログラム例(ABC290B)
解答として出力する string 型の変数 result を用意します。上で整理したように読み込んだ文字列 s を result に変換していきます。最後に result を出力します。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
string s;
cin >> s;
string result = "";
int count = 0;
for (int i = 0; i < n; ++i) {
if ((s[i] == 'o')&&(count < k)) {
result += 'o';
++count;
} else {
result += 'x';
}
}
cout << result << endl;
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC290B)
C++ のプログラムを移植しました。文字列の繰り返しは、range(len(s)) ではなく、enumerate(s) で書く方が Python らしいようです。range で書くと、pylint が警告を出力しました。
"""AtCoder Beginner Contest 290 B"""
n, k = map(int, input().split())
s = input()
result = ""
count = 0
for _, ch in enumerate(s):
if ch == 'o' and count < k:
result += 'o'
count += 1
else:
result += 'x'
print(result)
こちらも「AC」と判定されました。
最後に
問題文を読み替えて、求めている変換を明確にできれば、解ける問題でした。正しく問題を読み替えする能力は、一般的な局面でも重要な技術だと考えています。
引き続き ABC の問題を紹介していきます。