#0 - 文系出身エンジニアが競プロをやる
現在は幸運なことに、お給金をいただきながらエンジニアとして生計を立てることができています。
掲題の通りですが、3流私大文系学部出身で数学はとても苦手です。
そんな俺が、競技プログラミングコンテスト(競プロ)を触りつつアルゴリズムを勉強する過程を恥を忍んで公開しようと思います。
基本的なアルゴリズムは、実務上頭に入っていますが強くなりたい。
AtCoderに登録する
オンラインで参加できるプログラミングコンテストのサイトです。リアルタイムのコンテストで競い合ったり、約2000問のコンテストの過去問にいつでも挑戦することが出来ます。
とのことなので、AtCoderに登録しましょう。
事細かに記事にしても良いのですが、先達の方が十分すぎる内容の記事を書かれていますのでそちらを参考にしてください。
C/C++の基本を習う
さて、競プロを始めるとはいったもののAtCoderを登録して何から始めるか不明です。
言語は普段Rubyをメインに仕事をしていますが、どうやらAtCoderではC/C++が圧倒的な使用者の数を締めているとのこと。
最初はRubyかPythonかgolangあたりで書けばよいかなと思っていたりもしたんですが、公式言語とも言えるポジションとのことでC++を選択することに。蟻本とか有名そうな競技プログラミングの書籍がC++とかで説明されるならそちらを使った方が有意義だと思ったためです。
当然、C/C++など触ったことも書いたこともない文系出身の俺は学習を強いられたのでした。
とりあえず入出力と基本的なライブラリにざっと目を通します。
そして導入の数問をやってみることに。
PracticeA
iostream はinput/outputのストリームを扱うためのライブラリのようです。
ヘッダ(先頭)でinclude宣言をして、使います。
変数宣言をして、入力から値を受け取り、連結して出力します。
末尾に `return 0` を書いて提出します。
普段モダンなLL言語やgolangなどを書いているために、慣れない気持ちでしたが正常終了を返しておくのはなんとなくわかりました。
#include<iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a;
cin >> b >> c;
string s;
cin >> s;
cout << (a + b + c) << " " << s << endl;
return 0;
}
ABC086A - Product
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
string answer;
if ((a * b) % 2 == 0) {
answer = "Even";
} else {
answer = "Odd";
}
cout << answer;
return 0;
}
簡単ですね。
先ほどの iostreamを使って入出力を受け取り、整数ならEvenを返して奇数ならOddを返します。
ABC081A - Placing Marbles
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string inputs;
cin >> inputs;
cout << count(inputs.begin(), inputs.end(), '1');
return 0;
}
こちらも、サクッと解きます。
C++のライブラリを眺めていたら、アルゴリズムというものがあり、中身を読み進めるとどうやら `std::count` という便利なものがありそうなのでこちらを使用しました。
AtCoderを始めたのが25:30で記事まで書いたら遅くなってしまったので#0はこんなところで終わります。
導入編もう少し続きそうなので、#0.0とか書こうかな。
ゆっくりですが頑張っていきますので、これからよろしくお願いします。
(このマガジンは不定期更新です。)