競技プログラミング

文系人間が競技プログラミングに挑んだ結果

文系の人間が競技プログラミングに挑んだ結果、どこまでレートを上げることができたか、どのような勉強をしたのかということを紹介しようと思います。

また、競技プログラミングにより発生した仕事への好影響も挙げてみます。

筆者は文系かつプログラミング未経験でIT企業(SES)に飛び込んだという、よくある文系プログラマーのパターンに該当します。

実際に挑んだサイトは「AtCoder」ですが、他の競技プログラミングサイトでも過去問を解いていて、似たようなレベルの問題は解くことができているため、同じようなレートに落ち着くと思われます。

競技プログラミングに挑んだ

筆者の情報

私は文系大学卒、プログラミング未経験でSES企業に新卒で入社した、よくいるパターンの人間です。

周りの同期がどんどん業界を去っていく中、5年間ほど私は戦い続けることができています。

そんなわけで、5年ほどSES業界で過ごしてきた文系プログラマーが、巷で話題の競技プログラミングに挑むとどれくらいの成績を上げられるのかをまとめます。

ちょこちょこ、青色になれた!黄色になれた!という記事を見ますが、どこまでいけるのでしょうか!

ちなみに、ぎりぎり数学には苦手意識がないところは戦えるポイントかもしれません。

AtCoder で茶色になれた

約3か月程度、参加できるコンテストに参加してみたところ、無事に茶色レートまであげることができました。

また業務の都合上、最近はコンテストに参加することができていませんが、2コンテストに1回くらい、緑レート程度のパフォーマンスを出すことができているので、継続して参加すれば緑レートには到達できている可能性がありそうです。

ちなみに茶色と緑レートのレベル感は以下のような感じです。(AtCoder代表のchokudaiさんのブログから引用)

茶色

茶色になる条件は、Ratingが400以上になることです。茶色で保証できる実力ですが、正直、AtCoder内ではあまり高いレベルではありません。ただ、ここにたどり着く前に辞めてしまう人が多いので、十分にやる気がある人であるとは言えるでしょう。

なお、他社転職サイトと比較すると、このレーティングでも上位1~2%の最高ランクに到達出来る人が数割いるため、一般的には十分高いレベルであると言えます。

個人的な印象としては、

  • 情報系の学生が茶色であれば、ちゃんと勉強してるなって印象になる
  • 派遣で来たプログラマがAtCoder茶色だったら結構安心する
  • 茶色があればエンジニアとしてアルゴリズム面においての安心感があるかと言われたら、正直物足りない

みたいな印象があります。スキル的に確実に保証出来る点は、

  • 標準入出力、if、forなどの単純な操作はできる
  • 問題文を正しく理解し、計算量を考えない仕様通りの実装をすることが出来る

緑色

緑色になれれば、「競技プログラミングに熱心に取り組んでいる人」と考えて問題ないでしょう。要求レベルも決して低くなく、出場回数が足りないとマイナス補正がかかるため、運だけで到達することはまず出来ないラインです。他社アルゴリズム力判定サービスだと、上位1%の最高ランクが付く実力です。(あくまで「アルゴリズム力部分だけであることに注意してください)

印象としては、

  • 学生ならかなり優秀。
  • エンジニアとしてもある程度の安心感がある。論理的に複雑な処理の実装に対応できない、なんてことはなさそう、くらいには思える。データ量が多い現場など、計算量の多い処理が要求される現場でなければ、このレート帯以上を求める必要はほぼない。

くらいの印象です。もちろんアルゴリズム力しか計ってないので個人差があります。

技術的な部分では、

  • if、forはもちろん、それを組み合わせて2次元配列に対して操作をしたり、深さ優先探索や幅優先探索などのキューや再帰を使った実装も出来る。
  • 簡単な動的計画法の問題や、数学的に工夫する問題など、計算量の工夫も出来始める。

 

緑以上は本気で勉強しないと無理そう

私は茶色になれましたが、ほとんど勉強はしていません。SES経験5年という謎の力のみで戦っていました。

ちなみに、chokudaiさんが緑色のレベル感で述べている、深さ優先探索や幅優先探索は単語自体は知っていましたが、実装できるかというと無理です。動的計画法に至っては答え合わせの時に始めた名前を聞いたレベルです。(みんなが DP 言っているのがこれでした。こっちは知ってました。)

とはいえ、if文やfor文は普通に使えますし、これくらいの数をループした場合、3重ループは絶対無理だ、などの軽く計算量を考えるくらいは、業務でも行っていたのでできます。

こんなレベル感の人間が勉強せずに挑むと、茶色~緑色レートが限界だと思います。

はじめに書いた、青色になったぜ!黄色になったぜ!という人は、本気で競技プログラミングに挑んでいるうえに、才能も併せ持った超人クラスの人達ということが判明しました。

茶色だとどんな問題が解けるか

以下はAtCoder Problems さんからの引用です。AtCoder Beginner Contest レベルのC問題までは解くことができますが、D問題が解けるか解けないかの瀬戸際になってくる感じです。

毎回C問題までは20分程度で終わるので、D問題で残りの80分をうなりながら過ごしていました。

D問題は問題通りの結果を出す方法は見つかるのですが、実行時間超過でアウトになることが多いです。もっと効率出る書き方ができるということですね。

業務で言うと、とりあえず動くけどなんかこの処理遅くね、というものが作れるような感じです。(もちろん業務でそうなった場合は、何とかなるまで修正します。。。)

どのような勉強をしたのか

過去問をひたすら解いたのと、書籍を2冊ほど読みました。

それ以外はひたすらコンテストに参加するです。

AtCoder Problemsで過去問ひたすら解く

過去問は主にAtCoder Problemsさんで解いていました。

実際のコンテストで解いた件数も含まれていますが、合計で170問解いていました。

100、200、300点問題はひたすら解いていたので、コンテストでも躓くことはありましたが、大体解けるようになっていました。

逆に400点問題以降はほとんど解いていないので(解けなかった)、コンテストでも正答率は半々くらいでした。

競プロ界隈では過去問を解くことを「精進」と呼ぶようですが、まさに精進をしている感じでした。

解けば解くだけ成長を実感できるので、過去問演習はかなり効果的でしたね。

書籍を2冊ほど読んだ

競技プログラミングの書籍で有名なものを2冊読みました。

なお、内容はかなり難しいので、何も見ずに実装できるかと言われると正直無理ですが、「そんな解き方があるんだ」を把握することができるので、読んでおくと無難に知識が着きます。

AtCoderでコンテスト後に公開される解法は、書籍を読んで軽く知識をつけておくと理解しやすくなります。

読んだ本は競プロやるならまずこれ!である通称「蟻本」と、「螺旋本」を読みました。

蟻本は私のレベル(茶色)だと、正直内容がかなり難しいです。

序盤30%くらいまでは、二分探索や幅優先探索などのアルゴリズム入門レベルなので、なんとか理解できますが、その後は動的計画法やダイクストラ法など、水色以降のレベルで使われるであろうアルゴリズムが登場します。

とはいえ、超有名問題である「Ants」の問題から入るので、競技プログラミングの楽しさがなんとなくわかったりと、読んでおいて損は無いかなあという印象です。

競プロ界隈で有名な本のうち、比較的初心者向けと言われる「螺旋本」も読みました。

初心者向けと呼ばれる理由が正直わからなかったです。

正直蟻本と同じ感じで、序盤30%くらいはついていけますが、その後は一気に難しくなります。

個人的には「蟻本」か「螺旋本」を1冊じっくり読むで十分かなと感じました。

競技プログラミングをやって良かったこと

ここからは私の感想に過ぎない話ですが、競技プログラミングをやって良かったことを挙げてみます。

  • 0からコードを生み出すことが速くなった
  • アルゴリズムの知見が深まった
  • 計算量を考えるようになった
  • コードを休みのときでも書くようになった

挙げてみると結構プラスになっていて、競技プログラミング様様だなと思いますね。

0からコードを生み出すことが速くなった

圧倒的に0からコードを書く力が向上しました。

競技プログラミングをやる前は、意外とコードの書き始めでどうしたら良いのかなあ?と止まってしまったり、ゴールまでのイメージがなかなかつかず、実装の速度が遅かったです。

競技プログラミングでは、0からコードを書く必要があるのはもちろん、実装の速さも求められるため、最終的なゴールに向けてどのような実装をするべきか、素早く道筋を考える必要があります。

もちろん最初はうまいことできませんでしたが、競技プログラミングを続けるうちに、0からコードを書く速さが圧倒的に速くなりました。

これは仕事でもかなり役に立っています。

成果物の質が同じだと仮定した場合、速くコードを書けることは仕事の成果に大きく影響を与えます。

アルゴリズムの知見が深まった 少し実装できるようになる

正直、競技プログラミングを始める前は基本情報技術者試験で出てきた二分探索などの有名なアルゴリズムの存在を知っているレベルでした。

競技プログラミングをやると、二分探索などのアルゴリズムを実装しないと解けない問題などに当たるので、実装することができるようになります。

また、難しいアルゴリズムを実装することができるかと言われると無理ですが、名前だけはなんとなく知っているという状態になります。

競技プログラミングをやらなければ知ることはない世界を知ることができたのです。

計算量を考えるようになった

そのままですが計算量を考えるようになりました。

2重for文はメンバーのレベルにもよるかもしれませんが、良く使われるアルゴリズムだと思います。

これを1万件のデータで実行すると大抵かなり遅くなります。

想定されるデータ件数が1万件以上になる→2重for文はヤバそうだな、と考えることができる人がプロジェクトにいるのといないのでは大きな差が出るでしょう。

コードを休みの日でも書くようになった

大学までプログラムをやらないで入社して来た人の多くは、業務外でコードなんて書きません。

書いている人は1割もいないでしょう。私も書いていませんでした。

資格の勉強をする人はいるかもしれませんが、プログラムを書く人は本当にレアです。

実力は付けたい・・・でも休みの日に何をプログラミングすれば良いんだ・・・?というあなたに朗報です!

競技プログラミングをやると業務外でもプログラミングをすることができます!

何をプログラミングすればいいか分からない。という最大の壁も問題を解けば良いのでとっても良心的です。

競技プログラミングで業務外でプログラミングをする体力をつけると、競技プログラミング以外のことにも興味が向いていき、自分のWebサイトを作ったり、スマホアプリを作ったりといった方面にも手を出すことができてしまいます!

競技プログラミングやろうぜ!

一般のプログラマーが勉強せずに競技プログラミングに挑むと、ある程度の問題は解けますが途中で壁が出てきます。その壁を超えるには競技プログラミング的な勉強が必要になるでしょう。

しかしながら、その勉強は業務でも役に立つ内容になる可能性が高いです。

勉強がてら競技プログラミングをやってみるのはいかがでしょうか!

競技プログラミングをやる時間は無いけど、自分がどれくらいのレベルなのかを知りたい方は是非、この記事を参考にしていただけると幸いです!