この記事は、ミラパブのメンター・米田優峻さん(E869120)がご自身のブログに書かれたものを、本人の許可を得て転載したものです。元記事: 競技プログラミングのすすめ (中高生向け) - E869120's Blog(2026年8月17日)
競技プログラミングのすすめ
皆さん、競技プログラミングをご存知でしょうか。ゲーム感覚で楽しみながら、プログラミング力や思考力を身につけることができます。本記事では、競技プログラミングについて、そして高校生向けの主要な大会である情報オリンピックについて紹介します。
対象
プログラミングや数学に関心のある中学生・高校生
書いた人
米田優峻 (Masataka Yoneda; E869120)
- 東京大学修士課程
- 競技プログラミングの世界大会 ICPC で 1 万チーム中世界 2 位
- 数学やプログラミングの本が 10 万部突破のベストセラー
1. 競技プログラミングとは
競技プログラミングは、プログラミングの問題を解く能力を競う大会です。何問かのプログラミングの問題が出題され、どれくらい難しい問題を解けるか、それをどの程度短い時間で解けるかを競います。
イメージを下図に示します。たとえば AtCoder という、日本で最も有名なオンラインの大会では、5 問から 7 問程度が出題され、それを 2 時間程度で解きます。問題を解くプログラムを提出すると、自動で採点され、リアルタイムで順位表が更新されます。

2. 問題に挑戦しよう
それでは、競技プログラミングのイメージを持っていただくため、早速問題に挑戦してみましょう。
簡単な問題
整数 a と b を入力し、a + b を出力してください。
入力例
20
26出力例
46
この問題は、Python というプログラミング言語を使った場合、以下のように解くことができます。このように、競技プログラミングでは、入力に対し正しい答えを出力するプログラムを作成する問題が出題されます。
a = int(input())
b = int(input())
print(a + b)
工夫が必要な問題
先ほどの問題は簡単でしたが、競技プログラミングでは、工夫しなければ制限時間に間に合わない問題が出題されることがあります。たとえば、以下の問題を考えます。
入力される 50 個の整数の中からいくつか選び、合計をちょうど 10000 にする方法はありますか。もしある場合は
Yesを出力し、ない場合はNoを出力してください。入力例
100 101 102 103 104 105 106 107 108 109
200 201 202 203 204 205 206 207 208 209
300 301 302 303 304 305 306 307 308 309
400 401 402 403 404 405 406 407 408 409
500 501 502 503 504 505 506 507 508 509出力例
Yes
この問題を解く一番簡単な方法は、選び方を全パターン調べることです。たとえば、整数が 3 個の場合は左図のように 2 * 2 * 2 = 8 個のパターンを調べればよく、4 個の場合は右図のように 2 * 2 * 2 * 2 = 16 個のパターンを調べればよいです。

しかし、50 個の場合はパターン数が急激に増えます。パターン数は 2 を 50 回掛けた数、およそ 1000 兆通りになります。現代のコンピュータでは毎秒 10 億回程度の繰り返し処理しかできないので、全パターンを調べる方法では日が暮れてしまいます。もちろん、競技プログラミングでは、実行が数秒以内で終わらなければ不正解となるため、その解法では問題を解くことができません。
そこで必要になるのは解法の工夫です。難しいので詳細は省略しますが (競技プログラミングを学ぶと 1 カ月くらいで出てくるテクニックです)、解法を工夫すると、わずか 0.01 秒の実行で答えを出すことができます。
解法の工夫をやってみよう
それでは、皆さんも解法の工夫を実際にやってみましょう。まずは以下の問題を考えます。
私は 1 以上 10 以下の整数を思い浮かべています。5 回以内の Yes/No で答えられる質問を行うことで、思い浮かべている整数を当ててください。
一番自然に思いつく方法は、以下のように 1 個ずつ聞いていく方法です。
- 思い浮かべている数は 1 ですか?
- 思い浮かべている数は 2 ですか?
- 思い浮かべている数は 3 ですか?
しかし、その方法では最悪の場合 9 回の質問が必要になってしまいます。たとえば思い浮かべている数が 10 である場合、「思い浮かべている数は 9 ですか?」という質問まですべて No という回答となり、その段階でようやく答えが 10 であることがわかるのですが、ここまで 9 回の質問を使ってしまっています。
そこで、最初に「思い浮かべている数が 5 以下ですか?」という質問を行うことを考えます。すると、
- 回答が Yes の場合: 答えが 1~5
- 回答が No の場合: 答えが 6~10
であることが分かります。そこで答えが Yes の場合、続けて以下のような質問をすることを考えます。
- 思い浮かべている数は 1 ですか?
- 思い浮かべている数は 2 ですか?
- 思い浮かべている数は 3 ですか?
- 思い浮かべている数は 4 ですか?
と質問し、それでも全部 No であれば答えが 5 と分かります (合計 1+4=5 回の質問を使っています)。

最初の回答が No の場合も同様に、以下の質問をすればよいです。
- 思い浮かべている数は 6 ですか?
- 思い浮かべている数は 7 ですか?
- 思い浮かべている数は 8 ですか?
- 思い浮かべている数は 9 ですか?
これで 5 回を達成することができました。さらに工夫すると、4 回の質問で確実に答える方法もあるので、興味のある方はぜひ考えてみてください。

競技プログラミングでは、このような「計算回数を減らす工夫」が必要になる問題が多数出題されます。なお、専門用語になりますが、プログラミングの解法のことをアルゴリズムといい、競技プログラミングでは計算量を減らす工夫のことをよく「アルゴリズムの改善」などと言ったりします。
3. 代表的なコンテスト
AtCoder
AtCoder は日本最大級のオンラインコンテストです。毎週土曜日の 21 時にコンテストが開催され、全世界から 1 万人以上が同時に参加します。
AtCoder に早速登録してみたい方は、こちらの記事をお読みください。
また、早速問題を解いてみたい方は、AtCoder Beginners Selection という教材があるので、まずはそれを解いてみると良いでしょう。いきなり全部を解くのは難しいですが、最初の数問を解けば、感覚がつかめると思います。
AtCoder のコンテスト
AtCoder には初級者向けから世界ランカー向けまで、様々な種類のコンテストがありますが、その中で最初に取り組むものとして AtCoder Beginner Contest (ABC) がおすすめです。
また、最近の Beginner Contest には全部で 7 問ありますが、プログラミングを学び始めた方は 2 問解くことを目標にすると良いです。3 問目以降はアルゴリズムの改善が必要になります。
日本情報オリンピック
日本情報オリンピックは、毎年開催される、中高生向けでは最大の競技プログラミングの大会です。数学オリンピックのような大会はどこかで聞いたことがあるかもしれませんが、それと同じ系列です。
日本情報オリンピックのスケジュールは以下のようになっており、一次予選、二次予選、セミファイナル、ファイナルの 4 つの段階に分けられます。上位 4 名に残ると国際大会に進出でき、またセミファイナル以降まで進むと、大学の推薦入試等で有利になるケースがあります。

一次予選は 2 回行われ、どちらかに合格すれば二次予選進出となります。また、今年は昨年度とは形式が異なり、一次予選の時点で、簡単なアルゴリズムの改善が要求される問題が出題されます。
過去の傾向から見て、合格率 10~20% 程度が想定されるため、まずは一次予選の突破を大きな目標にすると良いと思います。
なお、いずれのコンテストでも、AI の使用は厳格に禁止されておりますので、ご注意ください。
4. 競技プログラミングと AI
読者の中には、今の AI 時代に、競技プログラミングを学ぶべきかという考えを持たれている方も多いと思います。ここで個人の考えとしては、今でも学ぶ意味があると考えます。
- 今後、AI がどこまで進展するか、およびどのレベルの AI まで一般に使えるようになるかは、企業や国家の方針に大きく依存するので、現段階で正確に予想することはできません。しかし、完全に AI に依存・従属した社会にならない限りは、最終的に物事を判断したり、AI を使いこなしたりするのは人間です。
- そこで、AI 時代に人間が物事を判断する際、物事を論理的、プログラミング的に考える思考力が非常に重要です。これはまさに競技プログラミングで身につく能力であり、今の時代でも学ぶに値すると思っています。
- もう一つの大きな理由として、競技プログラミングは数少ない「知的スポーツ」であるといえます。競技プログラミングでは、解法の検討やプログラムの実装を行う一方、順位表でライバルと競い合う、制限時間内で戦うなどゲーム要素があります。楽しみながら学びや思考をしたい方には非常におすすめです。
5. 競技プログラミングの学び方
それでは、競技プログラミングはどのように学べばよいのでしょうか。まず、最も人気のある学び方として、書籍が挙げられます。たとえば以下の本は、競技プログラミングで必要なアルゴリズムやテクニックがまとまっており、初級者から上級者に到達するのに最適です。
また、競技プログラミングのために、プログラミング自体から学びたい方は、以下のような教材がおすすめです。
最後に、競技プログラミングの過去問を解くことも練習方法のひとつです。上位者は総計 1 万問以上の問題を解いている方もいます。以下のページが便利ですので、ぜひお楽しみください。
宣伝: ミラパブについて
現在、ミラパブは外部の優秀な人材を生かし、中高生の能力を開花させようとする活動を行っています。興味のある方はこちらのページから応募ください。また、大学生以上でメンターに興味のある方はこちらのページをご覧ください。私もメンターであり、既に出張授業を 10 回ほど経験しております。