文系出身、事務系職種の筆者がIT企業の社内プログラミングコンテスト(社内プロコン)で1位を取るまでの流れをまとめました。
私の勤務先のソフトウェア開発会社では、社内プロコンが年3回開催されます(プログラミングサービスTOPSICを使用)。そこで経験した内容を書いた記事です。プログラミング初中級者の方の役に立てばうれしいです!
より具体的な勉強法は別途まとめてあります ⇒ プロコン1位になるための学習法
初めての社内プロコンでボコボコにされる
そこそこの準備をして挑戦した初めてのプロコン、それほど難しい問題が出なかったこともあり、実は全問正解できました。ただ、上位3名とのタイムを比較すると2倍くらい時間がかかっていたので実力差は明白でした。「100回同じプロコンをやったとして、5回勝てるか?」くらいの差はあったかと思います。
特に次の3点については、上位陣に比べて圧倒的に足りていないと思いました。
-
コーディング速度
-
問題への慣れ(問題文の言い回しなど)
-
瞬発的な思考力
また、Javaで参戦していましたが「スクリプト言語でコーディング量を少なくする」ことがプロコンではかなり有利に働くことも実感しました。
python(pypy)をはじめる
-
もともと興味があった
-
コーディング量を減らせるスクリプト言語だった
この2つの理由でpythonを学び始めました。
プログラミングテストで要求されるレベルはそれほど高くないので一週間程度でJavaよりも早くコーディングできるくらいにはなれたと思います。
しばらくするとスクリプト言語特有の壁にぶつかることになります。
-
実行速度が遅い・・・
-
言語の仕様なのでどうしようもない・・・
- PythonにはJITコンパイル(実行時コンパイル)言語pypyがあるらしい・・・ え!?
pypy、即採用決定です!
pythonと記法も同じで実行速度が速いので、(numpy等を使わない場合は)ほぼ全てのケースでpythonを使う理由がないです。
コーディング速度を上げる
基本的に慣れです。解いた問題量に比例しますが目標を明確に定めました。初参加のプロコンで優勝者のタイムが10分を切っていたので、まずはざっくりとした目標を立てました。
-
難易度1,2,3(※)のセットなら10分以内、できれば5分以内
※プログラミングサービスTOPSICを利用、難易度は1~6まである。
その目標を達成するためにはどうするかを各難易度の問題ごとに展開していきました。
-
難易度1 → 1分
-
難易度2 → 1~3分
-
難易度3 → 3~5分
このように少しずつ目標のメッシュを細かくして設定し、競技プログラミングサイト「AtCoder」を使って同じくらいのレベルの問題を解き進めました。
あとは、IDEのテンプレート機能を利用することで標準入力や典型問題のコーディングをかなりショートカットすることができるのでこちらも使い倒しました。
テンプレート機能なしだと、場合によってはコーディング速度に倍くらいの差がつくこともあるくらいです。
高難易度問題にボコボコにされる
前回のプロコンでは速度で負けたので徹底的に速度を上げる練習をしていましたが、2回目のプロコンでは難易度4の問題が出題されました。
「解けないこともないが正解率は低い」というレベルだったのですが、予想以上に手こずった結果、WA(=不正解)という結果でした。
それからしばらくは高難易度問題を解く練習をしました。
高難易度問題の打率(正解率)を上げる
AtCoderで高難易度(※)の問題を解いていきました。
※AtCoderの問題難易度はA,B,C,D,E,Fのように設定されている。
-
D → 打率8割
-
E → 打率5割
-
F → 打率2割
最終的にはこれくらいの正解率になった状態で1位を取ることができました。
社内プロコンを攻略した結果(成果)
-
コーディング速度爆速。1年前と比べると多分倍くらい早い。
-
業務系アプリ作る時もコーナーケースでハマりにくくなった。
-
DB(SQL)頼みのプログラミングをしなくなった。
-
話す話題、話す人が増えた。
さいごに
「競技プログラミングは業務に役に立たない」という声もありますが、少なくともコーディング速度倍になったら何をするにも生産性上がりますよね!
皆さんもレッツチャレンジ!!
- カテゴリ:
- キーワード: