競技プログラミングにおいて世界トップクラスの実力を持つ

高橋直大氏:みなさん、こんにちは。Day Oneを楽しんでいますでしょうか。AtCoder株式会社の高橋直大と申します。通称「chokudai」で通っているので、もしかしたらこの名前で知っている方もいるかもしれませんが、アルゴリズムのことをけっこうやっている人間です。

今回は「アルゴリズム人材の活かし方」というふわっとしたタイトルで話そうと思います。CTO協会のイベントなのにCTOではなくCEOですが、やらせてもらいます。

自己紹介をします。AtCoder株式会社の代表取締役をしている高橋直大と申します。名前を音読みにして「chokudai」と名乗っています。競技プログラミングの会社の社長をしていて、本を書いたり、Twitter活動で広報したりするのがメインです。フォロワーは5.5万人です。

プログラミングコンテストを真剣にやっています。スライドを見てもらえればわかるとおり、世界トップクラスと言ってもいい実力を持っていると思っています。

今日のトークテーマは「アルゴリズム人材の活かし方」

今日のトークテーマの「アルゴリズム人材の活かし方」について。

「今後入社するアルゴリズム人材ってどういう人? どう扱えばいい?」という、競技プログラミングやプログラミングコンテストの人たちがどういうものなのかという話です。また、そのアルゴリズムを用いて課題を解決するにはどうしたらいいのかについて話します。

今日はエンジニア、経営者、人事担当、誰が来るのか読めなかったのでアレですが、業務系の話をしようと思っています。Twitterのみなさん、コメントありがとうございます。けっこう見てくれているのがわかってうれしいです。

プログラミングコンテストとは何か?

まずはプログラミングコンテストについて。プログラミングコンテストとは何か。問題がたくさん与えられて、プログラムを書いて、それがコンピューターによって採点される。正解なら点数を獲得して、不正解ならやり直し。点数や解くまでの時間によって参加者全員に順位をつけます。最後の機能はコンテストによってあったりなかったりしますが、すべての戦績からランクを計算します。

スライドの写真でイメージしてもらおうと思います。今はほとんどオンラインでやっていますが、コロナ前のオンサイトでやった時の写真です。これは学生選手権と呼ばれるもので、今年もやる予定です。コンテストの会場にこのように人がたくさん集まって、コードをガーッと書くということをやっています。

何人いるんだというくらいたくさんいますが、こういうことをメチャクチャやっていて、プログラミングで問題を解くことを楽しんでいる学生がたくさんいます。これだけいますが、写真は予選を通った決勝の人だけなので、予選を含めたらもっといるわけです。

高学歴の学生の多くが競技プログラミングに参加している

主なプログラミングコンテストについて。僕の会社では「AtCoder」というサービスをやっています。海外にも、このようなサービスがたくさんあります。「Topcoder」というアメリカのサイト、「Codeforces」というロシアのサイトはサービスと言うべきかな。また「LeetCode」はどこなのか難しいんですが、採用試験に特化したサイトです。有名どころでは「Google Code Jam」や「Facebook Hacker Cup」、GAFAがやっているコンテストもあります。

これらは各社が採用のためにやっているものですが、ほかに高校生向けに「情報オリンピック」というものもあります。「Kaggleは?」と思う人がいるかもしれませんが、Kaggleは機械学習メインなので今回は外れるかなと思います。

プレイヤー人口もメチャクチャ増えています。5~6年前、2016~2017年には日本でリアルタイムでやる人は300人くらいしかいなかった。それが、(スライドを指して)少しデータが古いですが、2020年の時点では、5000人以上の日本人が毎週やっているコンテストに参加している。1回のコンテストに参加する人がこれくらいいる。2021年はコロナでメチャクチャ上がって、2022年は少し下がっていますが、リアルタイムで参加する人も1万人くらいいて、バンバン増えています。

プログラミングコンテスト人口については、一番出しやすいAtCoderのデータを出します。AtCoderの登録者数は約40万人。正確に言うと、今38万人かな。公開されるかたちで、所属を東京大学と書いている人が1,100人くらい、京大が500人くらい、東工大が400人と、高学歴の日本人の学生プレイヤーが非常に多いんです。

AtCoderやCodeforcesに特別スポンサードしなくても、今後入社してくるエンジニアは、プログラミングコンテスト経験者である可能性が非常に高いわけです。それこそ東大のエンジニアが入ってきたら、かなりの確率でAtCoderをやっているし、競技プログラミングを嗜んでいる人たちだということです。

競技プログラミングの問題例

では、どんなことをやっているのか。例えば、一番簡単な問題はどんなもので、どういうことをするのか。(スライドを指して)問題はこのように与えられます。

台形の要素が与えられていて、それに対して面積を求める問題です。プログラムをやっていない方はたぶんいないと思いますが、これを書くのは簡単で、例えばCで書くと、a、b、hを受け取って計算式を書いて出力します。

これが合っているか間違っているかの判断は難しいのですが、コンピューターが自動的に判定してくれます。テスト駆動開発のような仕組みを使ってコーナーケースをあらかじめ用意しておくことで、すべてのケースで正解するかをコンピューター上で採点して、リアルタイムで合っているか間違っているかが数十秒で出るシステムです。スライドのように順位表が出て、たくさん点数を取った人が勝ちとなります。

そもそもアルゴリズムとは何か?

先ほどからプログラミングコンテストの説明ばかりでアルゴリズムの話をしていませんね。そもそもアルゴリズムとは何か。

アルゴリズムとは基本的に、計算をどうやるかという手段、やり方のことなんです。悪いアルゴリズムだと計算が遅かったり不正確だったりするし、良いアルゴリズムだと計算が速かったり正確だったりする。

スライドの図は国立情報学研究所の方が描いたものです。1本のニンジンから星形のニンジンを20個作りたい時、輪切りを作ったあとに1つずつ星形に切ると221回切らないといけません。しかし、サイドを切ったあとに全体を星形にしてから輪切りにすると31回で済みます。このようにやり方によって大幅に手間が変わることがあります。

コンピューターの世界だともう少しいろいろあります。例えば、スライドのAからBに行くのにどれだけ時間がかかるでしょうか? さあ、コメントの早い者勝ちです。間の線の数字は何分かかるかです。AからBに行くのに何分かかるでしょうか?コメントが殺到すると信じて先に行きます。

(スライドを指して)Aからここをたどって4に行って、右上に行って3に行って、上に行って2に行くと、4、3、2、1の合計コスト10で行けるんです。

コメント1つも来てない(笑)。まあいいや。

10で行けるんですが、これくらいなら人間の手でできると思っても(次のスライドを指して)「これできる?」って言われると、もうやりたくないですよね。AからBまでいくらって考えたくないですよね。コンピューターにやってもらいたいし、コンピューターにできることに価値がある。パッと見ればわかるとおり、6個だと簡単だったのに今は20個弱かな。

この丸のことを頂点と言いますが、頂点が20個くらいになった時点で、もうやる気をなくすんですよ。コンピューターでやっても当然同じことが起こって、やることが大きくなれば大きくなるほど処理は大変になる。

アルゴリズムの重要性として、インターネットの世界でデータを扱う数がメチャクチャ増えているんです。データが増えるとそれよりもはるかに多く計算時間が増えます。

例えば100人いればペアは4,500通りしかないけれど、1万人からAさんとBさんを選ぶパターンが何通りかというと4,500万くらいの組み合わせがあるわけです。つまり、データは線形に増えていったとしても、計算しないといけない量はそれ以上の勢いで増えていくんです。計算を工夫しないと高度な処理ができない。

今はかなり低レベル。レベルが低いというわけではなくレイヤーが低いという話をしています。(コメントを見て)この答えは19なんですね、コメントありがとうございます。僕は知らないんですけれど。

アルゴリズムを用いた課題解決例

では、どんなことができるのか。(スライドを指して)これはALGO ARTISのページから持ってきました。液化天然ガス基地の運用効率化とか、なにかを効率化する。石炭火力発電所の燃料運用を効率化や最適化する時に……これだとスケジューリングかな? スケジューリングを1分刻みに正確に最適化するのは、人間ではできないけど、コンピューターならできる。だからすごいんです。

(スライドを指して)こちらは見た目がおもしろい例として、鹿島建設のホームページから持ってきました。鹿島建設は「クワッドアクセル」という自動運転をやっていて、工事現場を無人にするべく全部のマシンを人が乗っていない状態で動かしています。

これのなにがいいかというと、安全性を考慮する必要性が少し減るんです。人間だと車同士がぶつかったら死にますが、機械同士だと死ぬ人はいないから大丈夫。完全に制御されているから危ないこともできるし、そもそもぶつからないわけです。こういうすごいものがあります。

(次回へつづく)