AtCoder が提供しているABC(AtCoder Beginner Contest)279 のA問題をC++とPythonで解いてみました。ABC279は、2022年11月26日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 wwwvvvvvv(Difficulty : 7)
問題はリンク先をご覧ください。
文字列に含まれている文字によって計算をする問題です。AtCoder Problems による Difficulty は、7 でした。
解答案
問題を解く方針を書きだします。
- 文字列Sを読み込む。
- 文字列Sを先頭から末尾まで走査して、以下を行う。
- 文字が v ならば、解答の値を1増やす。
- 文字が w ならば、解答の値を2増やす。
- 解答の値を出力する。
C++ プログラム例(ABC279A)
方針通りに if 文を2回使って実装します。他に使っている文法も入門的な範囲です。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int result = 0;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == 'v') {
++result;
} else if (s[i] == 'w') {
result += 2;
}
}
cout << result << endl;
return 0;
}
問題文には、「v と w のみからなる文字列 S が与えられます。」とあります。v でなければ w となります。そのため、if 文を if – else に変更することができます。
競技プログラミングでは、多くの場合、厳しい時間制限があります。問題文に記載がある範囲でプログラムを簡素化することが許容されます。以下が、if – else に変更したプログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int result = 0;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == 'v') {
++result;
} else {
result += 2;
}
}
cout << result << endl;
return 0;
}
文字列Sを走査するための for 文を C++11 から導入された範囲 for 文に変更します。範囲 for 文は、Python などのスクリプト言語でも採用されています。慣れてくると、範囲 for 文の方がミスなく速く書けるようになります。以下が、範囲 for 文に変更したプログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int result = 0;
for (char c : s) {
if (c == 'v') {
++result;
} else {
result += 2;
}
}
cout << result << endl;
return 0;
}
すべての場合で AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC279A)
Python は、添え字を使うこともできますが、範囲 for 文で書く方が Python らしいと考えられているようです。以下が Python 版となります。
"""AtCoder Beginner Contest 279 A"""
s = input()
result = 0
for c in s:
if c == "v":
result += 1
else:
result += 2
print(result)
こちらも「AC」と判定されました。
最後に
簡単な問題でしたが、いくつかのプログラムを紹介しました。後に紹介したプログラムほど、ミスをする可能性が低いコードになっています。
競技プログラミングでは、時間制限があるため速く書く必要があります。このブログでは、速さと読みやすさを両立できるように書くことを目標にしています。
引き続き ABC の問題を紹介していきます。