競技プログラミング
とは

 プログラミングをよく知らない人にも伝わるであろう例として、以下のようなものを考えた。


 あなたが友人の家に行くと、本棚にこち亀が全201巻収納されていた。
しかし、その友人はずぼらなので、順番がバラバラである。
几帳面なあなたは、それを全部綺麗に直そうとした。
どうやってやるか?


 競技プログラミングでやることは大体こんな感じである。


 一番シンプルな方法なら、本棚から一旦全部の本を出して、その中からまず1巻を探して、最初に位置に持ってくる。次に2巻を探して、1巻の右に。以下201まで。


 本棚から全部の本を出すスペースがないのなら、最初に位置にある本を取り出し、1巻を探してその本と位置を交換する。次に2番目の位置にある本を取り出し、2巻を探してその本と位置を交換する。以下201まで。


 順番に並べると言う課題は、ものすごく一般的なものなので、過去の偉人たちにより何十種類もの手法が考案されており、上記の手法は選択ソートと名付けられている。
そして、クイックソートと言うやり方が名前の通り一番速いと答えが出ている。
クイックソートは結構難しく、ここでは説明できない。興味がある方はウィキペディアか何かで調べてほしい。


 競技プログラミングとは、このような課題を実際にコードで書いて解く勝負である。
解法が一つしかない課題であれば一番早く解いた人が勝ち、複数なら最も効率が良いコードを書いた人が勝ちなど、コンテストによってルールは異なるが、要するにプログラミングを使った頭脳勝負だ。

日本における
競技プログラミングの現状

 プログラミング能力を競う国際大会で、最も有名なものは、国際情報オリンピックだろう。
高校生を対象とした大会なのだが、ここで一つクイズを。


「2020年時点での累計メダル総数で、日本の順位は何位?」


正解は9位である。


1.中国
2.ロシア
3.アメリカ合衆国
4.韓国
5.ポーランド
6.ルーマニア
7.イラン
8.ブルガリア
9.日本
10.スロバキア


 この順位を見て、どのような印象を持たれるだろうか?
意外と健闘していると捉えるか、人口で考えたらこの順位は不味いと捉えるか。
日本のポテンシャルを考えたら、私は1位も狙えると思うので、この現状についてはあまりよろしくないと考える。


 中国が1位で日本が9位。
この差については、競技プログラマーの年齢分布が大きく影響していそうだ。


 国内最大の競技プログラミングサイトであるAtCoderのデータによると、スコア上位者の年齢で最も多いのは、中国の16歳に対して日本は23歳。


 日本の競技プログラマー年齢層が高めな一方、中国では10歳から競技プログラミングのスクールに通う子供がいる。
これでは、高校生が対象の国際情報オリンピックで勝てるわけがない。


 日本が世界一になる為には、我が国でも小学生から競技プログラミングスクールに通うような流れを作っていかなければならない。

国際情報オリンピック
   金メダルまでの道のり

 国際情報オリンピックで金メダルを取るまでの手順は、以下の通りである(2023年の場合)。


1:日本情報オリンピック一次予選(受験者約2000人中、上位約1000人が二次予選進出)

2:日本情報オリンピック二次予選(受験者916人中、上位160人が本選出場)

3:日本情報オリンピック本選(参加者169人中、上位29人が春合宿選抜)

4:春合宿(参加者28人中、上位4人が国際情報オリンピック出場)

5:国際情報オリンピック(参加者約300人中、上位1/12が金メダル)


 一般的な大会の金メダルと異なり、約25位くらいまでの選手が、金メダルを授与される。
そして、選手4人の獲得メダルの合計から、総合優勝国が決まる。
 また、過去15年のデータから、日本からの出場者で何のメダルを取れなかった選手(上位半分で取れる銅メダルも取れなかった選手)は、たった一人のみ。
日本代表に選ばれれば、高確率でメダリストになれる。
 国際情報オリンピック出場できる中高校生は、日本でたった4人だけ。
いかに狭き門かはご理解いただけるだろう。
言うまでもなく、努力のみでどうにかなる世界ではない。
 競技プログラミングスクールZINMUでは、全生徒で日本情報オリンピック本選出場を最低目標とし、その中でも特に才能がある生徒には、国際情報オリンピックで金メダル獲得を目標に、競技プログラミングを指導していく。

日本情報オリンピック
本選出場の難易度

 日本情報オリンピック本選に出場するのは、どのくらい難しいのか、実際に出題された二次予選(2022年)の問題を見てみよう。

 「A組~D組の4クラスから、それぞれ1人ずつ生徒を選ぶ。選ばれた4人の内、最も背の高い生徒と最も背の低い生徒の身長差の最小値を求めよ」

 例えば、入力されるデータが

A組:171,158,162
B組:170,169,165
C組:173,184,152
D組:172,171,160

の場合、A組:171,B組:170,C組:173,D組:172を選べば、max:173,min:170で身長差の値は3。今回はこの組み合わせが最小値なので、答えは3となる。
より差が小さくなるように生徒を選んで、その最小値を出せと言う問題だ。

普通に解くのであれば、単純に全組み合わせを求めて計算すれば良いのだが、そこは競プロ、以下のような制約がある。

「ただし、1クラスの生徒数は最大で75000人である」
全組み合わせは31640625000000000000通りとなり、とても実行速度が間に合わない。
それを工夫して、短い計算時間で終わるようなプログラムを書くのだ。

この年の二次予選は、上記の問題が解けるか解けないかが、本選に出場できるか予選落ちかのボーダーだった。

 私の体感では、プログラミング未経験からでも、IQ120以上の生徒だったら、2年くらい本気で頑張れば到達できるラインだと思われる。
(IQ120未満の生徒は、一生頑張っても届かない可能性が高いので、同じプログラミングをするのであれば、競プロではなくアプリケーション開発などを勧める)

競技プログラミングは役に立たない?

「競技プログラミングは意味ない」
「競技プログラミングは仕事に使えない」


 そんなことを言う人がいるが、それはただの僻みだろう。
東大卒は使えないと言う悪口と、本質的には同じだ。


 しかし、実際に優秀な競技プログラマーが、現場で活躍できないことがままある。
その原因は、やらせる業務を間違っているからだ。

競技プログラミングとシステム開発は全くの別物

短距離走者に

「これだけ走るのが得意なら、当然マラソンも速いよね」

と言う人がいたら、どうだろうか。
それくらい、同じプログラミングでも、競技プログラミングとシステム開発は別物だ。

システム開発の特長

 システム開発で最も重要視されるものは、メンテナンス性である。


 システムと言う物は、基本的には長期に渡って使用されることを前提に作る。
作ったらそれで終わりではない。
使っているうちに、追加機能を求められたり、新たなデータ形式に対応するような修正が必要になったりする。
可読性が高く重複が少ないコードでプログラムが書かれていると、機能追加や修正が楽になり、コストを大幅に減らす事ができる。
たとえ数年前に作られたシステムで、当初の開発メンバーが一人も残っていなかったとしても、コードが綺麗ならば、新しく入ったプログラマーが簡単に機能追加や修正を行える。
逆にコードが汚いと、それを読み解くくらいならば、最初からすべて作り直した方が速い。
せっかく作ったシステムを数年で壊してまた作る。なんと勿体ないことか。
そうならないために、優秀なエンジニアはメンテナンス性の高いシステム開発を心掛けるのである。

競技プログラミングの特長

 一方で競技プログラミングはと言うと、そこで書かれるコードはその場限りである。
そこで与えられる課題は不変で、システム開発のように後からの追加修正を気にする必要は一切ない。
自分が書いたコードを、後に他の人が触ることもない。
であるならば、コードの綺麗汚いは二の次である。
競技プログラミングは、より実行速度が速く、より使用メモリが少なくて済むコードを、短時間で書き上げることが重要なのだ。

競技プログラミングは就職に有利

 競技プログラミングとシステム開発の違いは分かっていただけただろう。
では、それを踏まえて、競技プログラミングは就職に有利なのか。
答えとしては、就職希望先の業務内容次第だと言えよう。
競技プログラマーのスキルは、ざっくり言うと効率のいいコードが書けることなので、効率を重視されない製作現場ではそのスキルは活かされない。


 具体的にどんなものかと言えば、1日に多くても100人くらいしか見ない、町のケーキ屋のホームページとかを作るweb制作会社に、競技プログラマーは要らない。
効率の良いコードを書いて、結果実行速度が半分になり、ページの表示が1秒から0.5秒になったとしても、大した差ではないからだ。
そういう会社ではそれよりも、「最低限のプログラミングしかできないけど、ちょっとしたイラストも描けます」というような人材の方が重宝される。


 では、どの領域で競技プログラマーが活躍するのか。


 web系で身近な所なら、SNSやオンラインゲームなど、1日に何千万回以上のアクセスがある大規模なサービス
「実行速度が5%速くなったので、サーバー代が5%減りました」などとなれば、それだけで数億円単位の影響がある。


 計算速度が大きく係るものでは、仮想通貨やNFTなどに使われるブロックチェーンの開発にも、競技プログラマーは必要とされる。


 他には、やはりAI・データサイエンス系だろう。
機械学習のプログラムを実行したことがある人であれば分かると思うが、1回の実行で数時間かかるというのは珍しくない。長ければ数日かかるようなものもある。
これが半分の時間で終わるようなコードが書ければ、試行錯誤の度にかかる待ち時間が減って、開発効率がだいぶ良くなる。
また、精度を高めると言うのも競技プログラマーの領域で、より高性能なAIの作成や、ロボティクス制御など、様々な分野でそのスキルは活かされる。


 競技プログラミングが得意であれば、こういった仕事に就けるので、就職は有利だ。
競技プログラミングのスコアで求人をかけている企業も、最近は増えてきている。
そういう求人のオファーは給料が高い傾向にあるため、高収入での就職を目指す人にとっては、競技プログラミングは有効な手段の一つと言えるだろう。


 例として、国内最大の競技プログラミングサービスであるAtCoderでは、多くの有名企業がコンテストを開催し、そこで成績優秀者をスカウトしている。

以下が各企業の最初のコンテスト開催日リストだ(2023/5時点)。

2012年08月 KLab
2012年11月 DigitalArts
2013年12月 リクルート
2014年09月 Donuts
2015年01月 ドワンゴ
2016年02月 DISCO
2016年02月 MUJIN
2017年03月 Yahoo
2017年03月 リクルートコミュニケーションズ
2017年03月 サイバーエージェント
2017年11月 北海道大学
2017年12月 コロプラ
2018年02月 Future
2018年06月 bitFlyer
2018年07月 SoundHound
2018年12月 CADDi
2018年12月 Asprova
2019年01月 エイシング
2019年01月 キーエンス
2019年03月 エクサウィザーズ
2019年05月 diverta
2019年06月 M-SOLUTIONS
2019年08月 ヤマト運輸
2019年12月 三井住友信託銀行
2020年03月 日立製作所
2020年03月 パナソニック
2020年05月 NOMURA
2020年06月 東京海上日動
2020年10月 PFU
2020年12月 鹿島建設
2021年02月 SOMPO HD
2021年05月 京セラ
2021年05月 マイナビ
2021年09月 サイシード
2021年10月 大和証券
2021年10月 UNICORN
2021年11月 トヨタシステムズ
2021年11月 NEC
2021年12月 THIRD
2022年02月 モノグサ
2022年02月 MC Digital
2022年02月 デンソークリエイト
2022年04月 ユニークビジョン
2022年06月 ALGO ARTIS
2022年06月 日鉄ソリューションズ
2022年07月 LINE
2022年08月 freee
2022年09月 estie
2022年09月 トヨタ自動車
2023年01月 ウルシステムズ
2023年02月 SKY

 このデータからも、年々、競技プログラマーの需要が増えているのが分かるだろう。
今後もこの傾向が続くと予想されるので、学生の内から競プロでプログラミング力を鍛える事には大きな意義がある。いずれは、一流企業のシステムエンジニア枠では、AtCoderやpaizaで一定のレート以上が無いと、エントリーすらさせてもらえない時代がくるかもしれない。

 また、アスペルガーやADHDなどの傾向がある知能が高い子供は、普通に就職するより、このルートでの就職の方が、圧倒的に有利だ。選択肢を広げる為にも、プログラミングが好きなら競プロを勧めたい。

競技プログラミングは受験に有利

 中学生で日本情報オリンピック本選に出場すれば、受験する高校によっては推薦入試で有利になるだろう。
大学受験は日本情報オリンピック本選出場程度だと私立の情報系くらいにしか行けないが、国際情報オリンピックのメダリストであれば、東大に推薦で入ることも可能である。

 国語と社会は致命的に嫌いだから一切勉強したくないけど、一般受験では国社必須の最難関大学理系に行きたい人は、推薦狙いで競プロを頑張るのも無しではない(個人的には推奨はしないが)。

TEACHER

講師

向井仁志
東京大学大学院工学系研究科卒業。Sierに入社し、ITコンサルとして勤務ののちAvalonConsulting株式会社にてCTOに就く。

向井の特長

・頭脳競技に強い
試験時間が60分のセンター数学を20分で解ける。
プログラミング未経験から1年で、paizaでSランクを取る。
・優しくて面倒見がいい
人にものを教えるのが好き。
できない人に対して苛ついたり怒ったりしない。
・説明が丁寧
見やすい資料作りに定評がある。
SPIの本を執筆し、商品レビューで解説が分かりやすいと高評価を受ける。
・面白い
隙あらばユーモアを入れようとしてくる。
大喜利が得意。
TARGET

対象生徒

プログラミング経験ありで算数・数学が得意な小中学生は大歓迎。
目指せ国際情報オリンピック金メダル!


日本情報オリンピック本選出場が目標だったり、AtCoder水色以上を取りたいと思っている高校生も歓迎。


プログラミング未経験の児童も、競技プログラミングを見据えた上で、まずは簡単なものから丁寧に指導するので、お任せいただきたい。



もし、競技プログラミングよりも、ゲーム制作に興味がある生徒は、弊社が運営する児童向けゲームプログラミングスクールがあるので、以下のリンクから参照を。


https://shiki-sci.jp/game-course/
PAYMENT

料金

1時間 6000 円(税込み6600円)

 競技プログラミングができる人材は希少なので、本来であれば1時間10000円としたいところではあるが、
日本の国力を増強するという社会的使命を果たすため、できる限り価格を抑えた。
最低限の事務手数料として、運営が1000円を頂き、残りの5000円全額を指導料として講師に払うことで、
サービスの質を下げないよう努力をしている。

体験授業は無料なので、気軽にお問合せいただけるとありがたい。

※体験授業の担当は向井ではなく私(落合)なので、そこはご留意いただきたい。

生徒実績

2023年

日本情報オリンピック一次予選通過(公立小5/私立中1/国立中2)

問い合わせる ▶