2年間にわたる本連載も、いよいよ最終回を迎えることとなりました。読者の皆さん、ここまでお読みいただき、誠にありがとうございました。

さて、私は中学1年のときに競プロを始め、中高生時代を「情報オリンピック」という1つの大会に捧げてきました。そして私はこの大会で世界のトップを目指すため、数千時間にわたる練習を重ねてきました。その結果、世界大会で金メダルを2度(特別参加選手としての参加を含めれば3度) 獲得することができました。

最終回となる本稿では、情報オリンピックで戦ってきた体験について記したいと思います。世界を目指すとはどういうことなのか、少しでも体感していただければ幸いです。

情報オリンピックとは

まずは筆者が出場した情報オリンピックがどのような大会か、簡単に説明したいと思いま す。情報オリンピックは高校2年生以下を対象とした競技プログラミングの大会であり、国内大会と世界大会の2つに分かれています。

国内大会

国内大会では4段階の選抜があります。一次予選は基本的なプログラムを書けるかどうかを問う問題が出題されます。例えば過去には「整数Xが与えられるので、X日が何時間であるかを出力せよ」といった問題が出題されています。一次予選は入出力や四則演算、for文やif文を使えれば解けるので、比較的容易に通過することができます。

しかし二次予選になると急激に難易度が上がります。本連載で説明したようなアルゴリズムの知識だけでなく、実際の問題に対してアルゴリズムを応用する力も要求され、全参加者の10%程度しか通過することができません。

さらに本選・春季トレーニングではより難易度の高い問題が出題され、最後の春季トレーニングに合格できるのは参加者約3000人中4人、倍率700倍超※1の狭き門となっています。

※1、2023 年のデータ。筆者が参加した2015~2020年は倍率約200~300倍。

世界大会

続いて世界大会では、各国の代表選手が同じ会場に集まり、2日間かけてコンテストを行います。開催国は毎年異なり、2022年はインドネシア、2023年はハンガリーで開催されました。2024年はエジプトのアレクサンドリアで開催される予定です。

世界大会ではコンテストの成績に応じてメダルが授与され、上位約8%は金メダル、上位約25%は銀メダル、上位50%は銅メダルとなります。その中でも特に金メダルは名誉が高く、多くの選手にとっての目標となっています。厳しい選抜に合格した日本代表選手ですら、金メダルを獲得できる選手は約4割しかいません。

金メダル獲得までの道のり

情報オリンピックについての理解は深まりましたか? それではいよいよ、本題である金メダル獲得までの道のりについて記したいと思います。

情報オリンピックを知る

まず私は2015年の4月、筑波大学附属駒場中学校に入学し、「プログラミングって何だか面白そう」「ゲーム制作もできるのか」といった単純な興味からパソコン研究部に入部しました。

プログラミングはほぼ未経験の状態からのスタートでしたが、先輩からの手厚いサポートのおかげで6月にはC++の基本的なプログラムを書けるようになりました。さらに7月には、文化祭に展示するゲームの制作にも挑戦しました。

しかし、この時点で入部時にやりたいと考えていたことが全て達成できてしまったため、プログラミングを学ぶ目的を見失ってしまっていた時期がありました。そんな10月のある日、先輩から情報オリンピックへの参加を勧められ、実際に問題を解いてみることにしたのです。

最初に見た本格的な問題は、1□2□3□4□5□6=7のような数式が与えられ、「□にプラスかマイナスを書いて、答えが合うようにする方法が何通りあるかを求めよ」という問題で した。

この問題は決して簡単ではなく、例えば、あり得る書き方を全て調べる解法の場合、式の長さが50程度になっただけで数千兆通りも調べる必要が出てきます。もちろん、コンピュータをもってしてもまったく計算が終わりません。しかし、「動的計画法」というすごいアルゴリズムを使うとわずか0.01秒で答えを出すことができます。

この解法を知って、私はアルゴリズムの工夫によって100年かかる計算が0.01秒になるのかと驚きました。さらに、さまざまなアルゴリズムを学んでいくうちに、Google Mapsの経路探索など、実社会にある多くのものがアルゴリズムと繋がっていることに気付き、感動を覚えました。

それがきっかけで、「自分も優秀な先輩方のように、アルゴリズムでいろいろな問題を解けるようになりたい」と思い、同年12月の情報オリンピック予選に参加することを決断しました。

上達を目指して

この瞬間から私は情報オリンピックで勝つことを目指し、本格的な練習を始めました。情報オリンピックの過去問題集だけでなく、大学生向けの大会である「ICPC 国際大学対抗プログラミングコンテスト」、日本最大級のプログラミングコンテストサイトである「AtCoder」 の問題にも挑戦。3カ月で500問以上の問題を解き、多い日は1日10時間以上も練習をしました。その結果、当時は競技人口が少なかったこともあり、中学1年次の初めての大会でトップ20に入ることができました。

中学2年になってからも練習を重ねました。当時は、解法が分かっていたのに試験時間内に問題を解き終われないといったことが多く、実装のスピードが課題になっていたため、問題を速く解くことに特化した練習も行いました。

すると翌年の情報オリンピックでは6位と、順位を大幅に上げることができました。さらに卒業を間近に控えた中学3年の3月には、AtCoderでのランクが上位0.5%の赤色に達し、史上初の中学生「レッドコーダー※2」になったのです。

※2、何らかのプログラミングコンテストサイトで赤色 (基本的には一番上のランク)になった人のことをレッドコーダーと呼ぶことがあります。

最大の挫折

しかしその1週間後、私は選手人生で最大の挫折を味わうことになりました。情報オリンピックの春季トレーニングで5位となり、次点で日本代表選手に選ばれなかったのです。レッドコーダーにもかかわらず4位以内に入れなかった選手は過去に一人もいなかったので、非常に大きなショックを受けました。

そこで私は、なぜこのような結果になったのかを分析しました。すると、AtCoderと情報オリンピックの問題傾向の差が原因であることが分かりました。当時の私は、情報オリンピックよりもAtCoder で赤色になるための練習に重点をおいていたため、情報オリンピックの問題傾向や、情報オリンピック特有の解法パターンに慣れていなかったのです。

このような苦手を克服すべく、私はそれ以降、練習方法を変えることにしました。具体的には次のようなことを行いました。

  • • AtCoderではなく、情報オリンピックの過去問を集中的に解く。
  • • 情報オリンピックの過去問は約300問しかないので、場合によっては解き直しも行う。
  • • 過去問演習だけでなく、情報オリンピックの解法パターンの分析も行い、本番パターンマッチングである程度解けるような状態にする。
  • その結果、翌年の情報オリンピックでは2位となり、晴れて日本代表に選ばれました。

    ついに世界大会へ

    そして2019年8月、いよいよ日本代表選手として初めて参加する世界大会(アゼルバイジャン大会)を迎えることになりました。私の目標は金メダル獲得。大会には80以上の国から327人の精鋭が集まりましたが、そのうち上位28人のみが金メダルを獲得することができます。では2日間の競技で一体どのようなことが起こったのでしょうか。

    競技1日目は、やはり異国の地アゼルバイジャンでの緊張、日本代表選手としての責任とプレッシャーがあり、完璧な成績を残すことができませんでした。一番簡単な1問を解くのに時間を取られ、試験時間の5時間中2時間が終わった時点では銅メダル圏外。後半で取り戻したものの、結果は28~59位タイ、金メダルの少し下の位置となりました。

    競技2日目も、序盤・中盤こそ上手くいったものの、最後に取り掛かった1問でプログラムをバグらせ、なかなか点数を上げることができませんでした。残り時間が迫る中、バグを直したつもりにもかかわらず正解が出ず、終了10分前時点でこの問題の点数が100点中40点しかない状況でした。「このままでは金メダルは厳しい」と絶望的な気持ちになったことを覚えています。

    しかし、最後まで諦めずにバグを探したところ、競技終了3分前、ついに本質的なバグの原因が分かったのです。急いでプログラムのバグを修正し、終了1分前にプログラムを提出して46点。終了30秒前にもプログラムを提出し、52点まで上げることができました。

    そして競技終了後、順位表を確認したところ、なんと25位。600点中6点差のギリギリで金メダルとなりました。このときは本当に飛び上がりそうなくらいうれしかったです。これで4年間の努力が報われたと思い、涙が出ました。

    情報オリンピックに参加して

    情報オリンピックは私の人生を良い意味で変えてくれました。まず、情報オリンピックがきっかけでアルゴリズムやコンピュータサイエンスに興味を持つようになり、東京大学情報科学科に進学することになりました。また、努力することの大切さ、最後まで諦めないことの大切さを学びました。

    しかしそれ以上に、情報オリンピックに参加して感じたことがありました。それは「金メダリストとして、社会に貢献しなければならない」ということです。

    振り返れば、私は中学1年のとき、先輩からの勧めで情報オリンピックを知りました。そして中学2年のとき、部活の先輩からさまざまな知識を教わり、上達することができました。しかしあるとき、これは環境のおかげだということに気付いたのです。私が情報オリンピックを知ったのも、優秀な先輩に教えてもらったのも、環境に恵まれていたから。そして世の中には情報オリンピックのような人生を変えるチャンスがない人も山のようにいる。

    だからこそ私は、他の人にチャンスを与えるのが金メダリストとしての使命だと思いました。そこで大学1年の春、早速、競プロの解法テクニックを集めた問題集「競プロ典型90問」を作成しました。次に、大学2年にかけて、以下の2冊の本を出版しました。

  • •「アルゴリズム×数学」が基礎からしっかり身につく本 (発行:技術評論社)
  • • 競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77の技術~(発行:マイナビ出版)
  • さらに大学 3 年の夏には主に一般層に向けて、『【フルカラー図解】 高校数学の基礎が150分でわかる本』(発行:ダイヤモンド社)を出版しました。もしこのような活動によって、人生を変えるきっかけを掴む人が1人でも増えたのであれば、これ以上嬉しいことはありません。

    最後に

    最後になりますが、本連載によって、競プロやアルゴリズム、情報科学に興味を持つ人が1人でも増えたのであれば、本当に嬉しく思います。記事にはわかりづらい部分もあっ たかと思いますが、最後までお読みいただき、誠にありがとうございました。

    そして情報オリンピックの世界大会で金メダルを取るまでに支えてくださった方々、私のこれまでの活動を応援してくださった全ての方々に対する感謝の言葉で本連載を締めくくりたいと思います。皆さん本当にありがとうございました。