突然ですが、高校生向けのプログラミング大会である日本情報オリンピック(以下、JOI と呼びます)で、都道府県ごとの参加人数にどの程度の差があるかをご存知でしょうか。
下のグラフは、2020 年までの、都道府県別の JOI への参加人数を示したものです(このページより)。東京都からは累計 2000 名以上参加しているのに対して、大分県からは 2020 年まで 1 名も参加していないという状況でした1。
ㅤ
僕は大学入学後、友達から「情報オリンピック(JOI)とか数学オリンピック(JMO)とか、そういうのあるの知らなかったし、知ってたら参加したかった......」という声を何度も聞いてきました。
JOI という世界を知ることでより幸せになれるのに知らない状態の生徒さんが、特に地方にはたくさんいるでしょう。少しでも、そうした生徒さんたちにこの世界を知ってもらい、人生の可能性を大きく拡げてほしい......そう願って、2020 年頃から少しずつ活動してきました。
まだ道半ばですが、2025 年 12 月現在までに次のような成果が得られました。
- 都立 A 高校で指導に関わった生徒さんが、ヨーロッパ女子情報オリンピックの日本代表選手となり、銅メダルを獲得 🎉
- 茨城県教育委員会のプログラミングエキスパート育成事業で指導に関わった生徒さんが、茨城県史上初となる、国際情報オリンピックの日本代表選手最終選考に進出 🎉
- 2025 年度には、大分県立大分舞鶴高等学校で指導に関わった生徒さんたちが、10 名以上 JOI 一次予選を突破 🎉
今回の記事では、これらの活動を振り返ってみます。
また、生徒さんたちとの関わりの中で生み出した「AtCoder 水色を目指すための練習方法」も紹介します。この練習方法は、JOI を目指す高校生だけでなく、IT 業界への就職を狙う学生さんや、IT 業界でスキルアップを目指す社会人の方にも適用できるものだと思います。
ㅤ
0: 情報オリンピック(JOI)とは
最初に、JOI とは何かを簡単に紹介します。JOI は高校生向けの「競技プログラミング」(通称、競プロ)の大会です。そして、競技プログラミングとは、一言でいうと
プログラミングを使って、パズル的な問題を、制限時間内に出来るだけ多く解くスポーツ
です。AtCoder を聞いたことのある方は多いと思いますが、AtCoder はその「競技ログラミング」のコンテストを運営する会社、およびサイトです。
JOI は、競技プログラミングの世界で腕を競い合う高校生たちの青春の場となっています。
ㅤ
ㅤ
JOI の流れは上の図の通りです。レベル感を簡単にお伝えすると、JOI 一次予選の突破は、Fizz Buzz のような問題が解ける程度の能力を求めています。情報科学の教育に力を入れている高校では、基本情報技術者資格の取得などと並んで、成果を示す到達指標として扱われている印象です。
JOI 二次予選の突破は、各種のスポーツにたとえると、インターハイ出場に相当する成果といえます。そこから先は、その道のプロを目指すような水準になります。
ㅤ
1: これまでの JOI 普及活動
今更となりますが、簡単に自己紹介します。
現在、株式会社NTTデータ数理システムの顧問(広報担当)と、モノグサ株式会社のコンテンツアーキテクト(数学教材の開発)をしています。また、趣味として競技プログラミングへの参加や、競技プログラミングに関するさまざまな活動(後述)などをしています。
活動 ① :アルゴリズムの書籍の出版(2020 年 〜 2022 年)
何事も教材がなければ始まらない......ということで、これまで Qiita 上にたくさんの記事を寄稿してきました。
ㅤ
- 記事例 1: AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
- 記事例 2:計算量オーダーの求め方を総整理! 〜 どこから log が出て来るか 〜
- 記事例 3:動的計画法超入門! Educational DP Contest の A ~ E 問題の解説と類題集
ㅤ
そして、これらの記事を見ていただいた講談社サイエンティフィクから書籍化のお声がけをいただいて、2020 年に拙著『問題解決力を鍛える! アルゴリズムとデータ構造』を出版しました2。本当に、出版社の方々のアンテナはすごいですね。その後も執筆活動を続けて、これまでに 4 冊の本を出版しました。
こうした執筆活動によって、「この記事をキッカケに競プロを始めました!」「この本を読んだおかげでエンジニアになれました!」といった、ものすごく嬉しい言葉をたくさんいただけるようになってきました。
そのうちに、執筆を通して間接的に読者の方々に働きかけるのもいいものだが、もっと直接、人と競プロを通したコミュニケーションをとりたい!! と思うようにもなりました。
ㅤ
活動 ② :ツイキャス配信を通した高校生の応援(2020 年)
そこで、ツイキャス(TwitCasting)という配信アプリを活用して、リスナーとして来てくれた高校生たちが好きなことを追求し合える場を作る活動をしました。とくに、「クラスに競プロなどの話をできる相手がいない......」と悩んでいる地方の高校生たちが、興味を同じくする仲間を見つけて切磋琢磨し、なんらかの成果をあげて、世界を拡げられるキッカケを作りたいと考えていました。
結論から言えば、この活動はあまりうまくいきませんでした。高校生の生徒さんの世界を本当に拡げるためには、それなりの期間、腰を据えて並走して、何かしらの成果をあげる必要があります。しかし、ツイキャスのような気まぐれな場では、具体的な成果に結び付けることは難しかったのです。
そこで、「学校としての取り組み」という形で、JOI を目指していく方向性にできればよいと考えました。しばらくは試行錯誤の日々でした。Facebook での発信を盛んにやり始めて、全国の情報教員の方々との繋がりを作り始めました。
ㅤ
活動 ③ :都立 A 高校での授業(2022 年 〜 2025 年)
......ツイキャス活動そのものはうまくいかなかったとはいっても、決して無駄にはなりませんでした。当時リスナーの 1 人でもあった、一般社団法人ミラパブ(当時の名称は、やりたいこと支援サークル)運営スタッフの ideal(イデアル)氏が、都立 A 高校の B 先生と繋いでくれました。
そして早速、2022 年 8 月に最初の授業をしてみました。最初のうちは 1 名の生徒さんしかいないこともありましたが、2023 年には 4 名に増え、2024 年には 10 名を越すようになりました。
これだけ人数が拡大したのは、最初の 1 名の生徒さんとの出会いが大きかったように思います。身体はあまり丈夫でなく、体調面で苦労する日々も多かったのですが、一生懸命に取り組む生徒さんでした。また、引っ込み思案ながらも面倒見がよく、部活紹介を頑張ったり、友達に布教活動をしたり、集まったメンバーたちを影で支えたりしていました3。
結果として、どの生徒さんも、それぞれの目標を達成する成果をあげることができました。具体的な練習方法などついては、後述します。
ある程度成果が得られたところで、学会発表にも取り組みました。下のポスターは、2024 年度の全国高等学校情報教育研究会(愛知大会)で発表したものです4。
ㅤ
ㅤ
なお、学会発表はやはりいいもので、その後の活動にも繋がっていきます。後述する大分県立大分舞鶴高等学校の伊藤大貴先生との出会いも、この種の学会でのことでした。
ㅤ
活動 ④ :競プロ支援サイト AtCoder NoviSteps の個人開発(2023 年 〜)
都立 A 高校での取り組みを、もっと全国に拡げていきたいと考えたとき、再び、教材が欲しいと考えるようになりました。活動 ① に挙げた拙著は、プログラミングを本当に始めたばかりの生徒さんにはレベルが高すぎました。また、都内の学校であれば月一などと高頻度に訪問させていただくことが可能ですが、地方の学校だとそうはいきません。
そこで、hiro さん、ウルズニャーさん、nonon さん、Blueberry さんら有志メンバーと一緒に、AtCoder の過去問を自律的に効率よく練習できるサイト AtCoder NoviSteps の開発を始めました。
![]() |
| マスターした問題には緑色、また復習したい問題には青色......などと管理できます |
AtCoder NoviSteps では、競プロで出題される問題を解くのに必要なアルゴリズムの素養を「NoviSteps グレード基準」によって、17 段階(10Q, 9Q, 8Q, ..., 2Q, 1Q, 1D, 2D, ..., 7D)に分けて定義しています。たとえば、下の表は 7Q で学ぶ内容を定義したものです。
ㅤ
ㅤ
この NoviSteps グレード基準は、
- 茨城県教育委員会のプログラミングエキスパート育成事業の初級カリキュラム作成
- AtCoder 社における、問題の絶対評価と、作問の自動化に関する R&D
などにも活用いただいています。そして、NoviSteps では、このグレード基準に基づいて、必要な素養を集中的に学べる練習問題集を提供しています。これらの問題を順に解くことで、スムーズにスキルアップできます。
ㅤ
ㅤ
活動 ⑤ :茨城県プログラミングエキスパート育成事業(2024 年 〜)
茨城県教育委員会はとても教育熱心で、平成 30 年度から、全国トップレベルのプログラミング能力を持つ中学生・高校生を育成するため、プログラミング・エキスパート育成事業を実施しています。
現在は、「ゲーム・アプリ開発コース」「AI プログラミングコース」「競技プログラミングコース」とに分かれていて、昨年・今年と、競技プログラミングコースの講師を務めさせていただいています。
ここでは生徒さん同士も仲がよく、毎回活発な議論が行われています。結局は、講師があれこれ教えるというよりも、生徒同士の活発なコミュニケーションこそが才能を大きく伸ばすのだと感じています。それを促進できるような雰囲気を作ることが、我々の仕事だと実感しています。
ㅤ
活動 ⑥ :大分県立大分舞鶴高等学校の科学部情報班の活動支援(2024 〜 2025 年)
大分県は、JOI の普及が最も遅れた都道府県でした。2005 年に現在の JOI が始まってから、2020 年まで、ただ 1 人の参加者も現れなかったのです。
そんな中で、本当にありがたいことに、学会を通して出会った大分県立大分舞鶴高等学校の伊藤大貴先生(当時)にお声がけいただいて、JOI 指導の機会をいただきました。伊藤先生は、同校に科学部情報班を新設し、生徒さんたちを勧誘して、さまざまな活動に活発に取り組む空間を作り上げました5。僕はそのうち、JOI に関する部分を担当させていただきました。
ㅤ
ㅤ
僕個人の挑戦ポイントは、遠方ゆえに限られた回数しか生徒さんたちと関われない中で、どこまでのことができるだろうか......という部分にありました。生徒たちが自走しやすいようにと AtCoder NoviSteps を開発してみたものの、果たしてどの程度有効に機能するかドキドキしていました。
この高校の科学部情報班の特徴は、なんといっても、生徒さんたちが明るく活発で、本当に楽しそうに議論することです。そして、もともと数学への関心が強いというところから入部した生徒さんもいれば、もともと Web 開発などへの関心が強いというところから入部した生徒さんもいました。異なる背景や趣味をもつ生徒さんが集まって、ワイワイお話できる環境はとても貴重です。お互いに「自分にはないもの」を持っていると感じ合うことで、大きな刺激が得られるのです。
生徒同士の学び合いの効果は凄まじいものでした。僕はこれまで、「ある程度のレベルからは生徒自身の自走で進めることはわかっているが、Fizz Buzz を習得するレベルまでは手取り足取りの指導が必要かもしれない......」とも考えていました。しかし、大分舞鶴の生徒さんたちは、この予想を大きく超えていきました。
結果として、2005 年 〜 2023 年まで JOI 参加者が累計 8 名しかいなかった大分県において、2024 年は同校のみから 10 名以上の JOI 一次予選突破者を輩出する成果をあげました 🎉
ㅤ
2: AtCoder 水色になるための練習方法
たくさんの生徒さんたちと関わる中で見出した競プロの練習方法を紹介します。
ここでは、高校入学時点でプログラミングを全く経験したことのない初心者の生徒さんが、高 2 冬の大会で JOI 二次予選突破(セミファイナルステージ進出)を目指すことを想定します。
高校で情報科の教員をしている方々の間では、一次予選突破までは比較的容易に実現できるが、二次予選突破は困難だという印象を抱かれがちです。しかしながら、十分な練習時間を確保できれば、各学校で 2〜3 名程度の生徒さんが達成できることと思います。
なお、JOI 二次予選突破のラインは、2024/2025 年度の大会では、AtCoder 緑色〜水色程度(下の図の C 〜 B ランク)に相当するものでした。

(電通 プログラミングコンテスト運営のAtCoderとIT人材創出ビジネスを開始より)
ㅤ
いくつかのフェーズに分けて紹介します。下の表で、「グレード」とは、「NoviSteps グレード基準」のことを指します。また、「レーティング」とは、AtCoder のレーティングのことを指します。
| 練習グレード | 到達目標 | 到達レーティング(目安) | JOI で目指す成果 | 取り組み期間(目安) | |
|---|---|---|---|---|---|
| フェーズ ① | 10Q 〜 7Q | プログラミングの素養を身につけて、Fizz Buzz をスラスラ書けるようにする | R100 | JOI 一次予選突破 | 高 1 の 4 月 〜 5 月 |
| フェーズ ② | 6Q 〜 5Q | 全探索に基づく解法をスラスラ実装したり、計算時間を予め正しく見積もったりできるようにする | R200 | 高 1 の 6 月 | |
| フェーズ ③ | 5Q 〜 4Q | 二分探索や累積和など、計算量を削減するテクニックを少しずつ学ぶ。また、高校数学に習熟して、数学的な考察を要する問題を解けるようにする | R300 | 高 1 の 7 月 〜 10 月 | |
| フェーズ ④ | 3Q | DFS, BFS, UnionFind などの典型的なアルゴリズムとデータ構造を学ぶ | R500 | 高 1 の 11 月 〜 3 月 | |
| フェーズ ⑤ | 2Q | たくさんの問題を解いて、フェーズ IV で学んだアルゴリズムを応用できるようにしていく | R800 | 高 2 の 4 月 〜 6 月 | |
| フェーズ ⑥ | 1Q 〜 1D | さらにたくさんの問題を解いて、実用上では最高レベルのアルゴリズムの問題が解けるようにする | R1200 | JOI 二次予選突破 | 高 2 の 7 月 〜 12 月 |
| フェーズ ⑦ | 1D 〜 | 競プロを極める | それ以上 | それ以上 | さらに余裕がある人向け |
ㅤ
フェーズ ①(目標 R100, 7Q): プログラミングに慣れる
フェーズ ① の目標は、プログラミング言語を学び、プログラミングに慣れることです。具体的には、Fizz Buzz 程度の問題をスラスラ解けるようにすることです。これを達成できれば、JOI 一次予選を突破できます。
① - 1: AtCoder に登録する
競技プログラミングを始めるためには、まず AtCoder に登録しましょう。登録の仕方や、AtCoder の始め方については、次のような記事を参考にしてみてください。
AtCoder では、毎週土曜日 21:00 から初心者向けコンテスト AtCoder Beginner Contest(ABC)を開催しています。このようなコンテストの過去問が 2025 年現在、7000 問以上も溜まっています。これらの問題を解きまくることで実力アップが期待できます。
また、毎週土曜日の ABC に参加することは、JOI の練習にも大いに役立ちます。毎週参加すれば、2 年間で 100 回もの実戦練習を積めるのです。
(AtCoder の コンテスト一覧ページ )
ㅤ
① - 2: プログラミング言語(特に C++)を学ぶ
まずは、プログラミング言語の文法を学びましょう。言語の選択に悩む方は多いですが、特に JOI においては C++ をオススメします。以下の点が理由です。
- JOI の二次予選までは C++ 以外の言語を使うこともできるが、JOI セミファイナルステージ以降は、事実上 C++ しか使えない6
- 競プロに関する既存のさまざまな書籍や解説資料のプログラムは、C++ で書かれていることが多い
- Python などでは、たとえ正しい解法を実装しても、実行制限時間に引っかかることがある
プログラミング言語を学ぶ方法はなんでもよいのですが、AtCoder は「競技プログラミングでの活用を念頭においた C++ 入門教材」である APG4b を提供しています。特にこだわりがなければ、APG4b を学ぶのが良いと思います。
ただし、この教材のすべてを学ぶ必要はありません。1 章は必須ですが、2 章以降は必要に応じて目を通していく感じで十分です。他の教材で学ぶ場合であっても、競プロにおいてどのような文法を学ぶべきかについては、下の図を参考にしてください。
ㅤ
① - 3: ひたすら易しい問題を解いて実装に慣れる
プログラミング言語の文法を勉強しながら、ABC の過去問を大量に解くことで、プログラミングに慣れましょう。1 つのオススメの方法は、上述の AtCoder NoviSteps 上で 10Q から 7Q までのカリキュラム問題集を一通り解くことです。
10Q から 7Q まで、全部で 29 個の問題集があり、それぞれ 5〜10 問程度の問題を収録しています。各問題集で、上から 1, 2 問を解いて易しく感じた場合は、残りの問題は飛ばしてしまってよいでしょう。学習期間の目安としては、次の 2 つを想定しています。
- 高 1 冬での JOI 一次予選突破を目標にする場合:1 個の問題集が、週 1 回分の授業の宿題として相応しいように設計しています。約 30 週間でマスターすることを目指しましょう
- 高 2 冬での JOI 二次予選突破を目標にする場合:可能ならば、最初の 1 〜 2 ヶ月で、ここまでは終わらせてしまいましょう
(AtCoder NoviSteps の 7Q のカリキュラム問題集の一覧)
ㅤ
他の方法としては、AtCoder Problems という過去問集積サイト上で、ABC の A 問題をひたすら解いていく方法もよくとられています。A 問題の大半は、9Q 〜 7Q のいずれかの難易度です。好みの方法で精進しましょう。
フェーズ ②(目標 R200, 5Q): 全探索の習熟と、計算量の理解
フェーズ ② の目標は、
- 多くの問題は、無限の計算機リソースを使えるものと仮定すれば、考えられるすべての場合を調べ上げることによって原理的には解けることを理解する(NoviSteps 6Q, 5Q)
- 一方、競プロの多くの問題では、プログラムの実行時間に制限があることを理解し、自分が実装しようとしているプログラムがどの程度の計算時間を要するのかを見積もることができるようになる(NoviSteps 5Q)
ことです。計算量を見積もることができるようになった上で、具体的に計算量を削減する方法を学ぶのは、次のフェーズ ③ 以降の目標となります。フェーズ ② では、計算量の見積もりをできるようになりましょう。
なお、高 2 冬での JOI 二次予選突破を目指す場合、高 1 夏休み前までに、フェーズ ② をクリアしたいところです。その理由は、次のフェーズ ③ は腰を据えてじっくり取り組む必要があり、できれば夏休み中に取り掛かりたいからです。
ㅤ
② - 1: 全探索に慣れる!
問題を解くために、「考えられるすべての場合を調べ上げる」ようなアルゴリズム設計技法を全探索とよびます。全探索は単純な方法ですが、いざ具体的な問題と対面したときに、意外と思いつかない人も多いのです。たとえば、次の問題の解法をパッと思いつけるでしょうか。
【出典:AtCoder ABC 177 B - Substring】
(グレード:6Q)
2 つの文字列 $S, T$ が与えられます。
$T$ が $S$ の部分文字列となるように、$S$ のいくつかの文字を書き換えます。
少なくとも何文字書き換える必要がありますか?
ㅤ
(制約)
- $S, T$ は 1 文字以上 1000 文字以下
このような問題を条件反射で解けるようになりましょう!
具体的な練習方法としては、上で紹介した AtCoder Problems などのサイトを用いて、ABC の B 問題をひたすら埋めていく方法が有効です。また、次の記事でも、全探索の問題が数問挙げられています(後半は難しいので、フェーズ ② の段階では前半 6 問のみで十分です)。
ㅤ
② - 2: 計算量を見積もれるようにする!
NoviSteps 6Q までは、よほどおかしな実装をしない限り、プログラムの計算実行時間を意識しなくても正解することができます。しかし 5Q からは、プログラムの計算実行時間を正しく見積もり、効率的なプログラムを提出しないと TLE(Time Limit Exceeded の略で、実行時間制限を超過していることを表す)という不正解の判定になることが増えてきます。目安として、
標準的な市販コンピュータが 1 秒間で計算できる回数は、約 $10^9$ 回程度である
ということを押さえておきましょう。AtCoder 上の多くの問題では、プログラムの実行制限時間は 2 秒に設定されています。for 文をかくとき、たとえば $10^{10}$ 回以上の反復は許容されないということです。
とくに、二重の for 文をかくときには注意が必要です。たとえば、入力のサイズ $N$ に対して、$N \le 10^5$ という制約があるとしましょう。このとき、次のようなプログラムでは TLE となります。
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// 何か書く
}
}
なぜならば、この二重の for 文のループ変数 i, j のとる値の組は、下の図のマス目の個数に等しく、
$N \times N = N^2$ 個
となります。
つまり、$N = 10^5$ のとき、上記のプログラム中の for 文の反復回数は $N^2 = 10^5 \times 10^5 = 10^{10}$ 回となります。これでは実行制限時間を超過してしまいます。
$O(N^2)$ や $O(N \log N)$ といった計算量のオーダー表記も、この段階で学んでいきましょう。具体的に計算時間を見積もる方法については、たとえば次の記事などで勉強してみてください。
ㅤ
② - 3: 標準ライブラリを使いこなせるようになる!
最後に、フェーズ ② でもう 1 つ大事なことは、プログラミング言語の標準ライブラリの扱いに習熟することです。C++ では、STL で下の表に示すようなデータ構造やアルゴリズムが定義されています。
| STL | 内容 | NoviSteps グレード |
|---|---|---|
vector |
可変長配列 | 8Q 〜 |
string |
文字列 | 9Q 〜 |
set |
集合 | 6Q 〜 |
map |
連想配列 | 6Q 〜 |
stack |
スタック | 5Q 〜 |
queue |
キュー | 5Q 〜 |
priority_queue |
優先度付きキュー | 4Q 〜 |
関数 max()
|
最大値を求める | 9Q 〜 |
関数 sort()
|
ソートする | 6Q 〜 |
関数 lower_bound()
|
二分探索する | 4Q 〜 |
関数 next_permutation()
|
次の順列を求める | 3Q 〜 |
STL の使い方については、たとえば次の記事で勉強してみてください。
ㅤ
② - 4: 「ABC B 問題」または「NoviSteps の 6Q 〜 5Q の問題」を埋める
最後に、上記の素養をしっかりと身につけるため、
- ABC の B 問題を埋める
- AtCoder NoviSteps の 6Q 〜 5Q の問題一覧を埋める
といった取り組みを進めましょう。なお、「B 問題」「6Q 〜 5Q 問題」のうちの片方に取り組めば、他方も必然的にこなすことになるため、肌に合う方を選択しましょう。十分解けるようになったと感じたら、問題が残っていてもよいので、次のフェーズ ③ に進みましょう7。

(AtCoder NoviSteps のコンテスト別ページの、ABC の過去問一覧。この B 列を埋めていきましょう)

(AtCoder NoviSteps の 5Q の問題一覧の一部。これらの問題を埋めていきましょう)
フェーズ ③(目標 R300, 4Q): 計算量削減テクニックと、数学的考察の習得
フェーズ ③ の目標は、フェーズ ② で見積もれるようになった「計算量」を具体的に削減するテクニックを習得すること(NoviSteps 4Q 相当)です。
ここで、計算量を削減するためには、しばしば数学的な考察を必要とします。フェーズ ③ 以降は数学から逃げることはできません。アルゴリズムの知識だけでなく、数学力も一緒に磨いていく必要があります。
また、高 2 冬の JOI 二次予選突破を目指すとき、このフェーズが大きな関門になります8。問題に挑んでも解けなかったり、さらには解説を読んでも理解できなかったり......といった苦しみが発生するようになるのです。
じっくり腰を据えて取り組む必要があるため、高 1 の夏休み中に取り組むのが理想的です。フェーズ ③ では、どうしても「わからない......」という苦しみが発生しやすいため、友達同士で盛んに議論し合える環境を作れるとよいでしょう。問題を解くペースとしては、1 日 3 問程度のペースで解いていきたいところです。
そして、高 1 の 9 〜 10 月頃には、NoviSteps の 4Q の問題を概ね解ける状態にして、次のフェーズ ④ へ進められれば理想的です。その頃には、まだ JOI 二次予選の突破は厳しいですが、100 〜 150 点程度はとれるようになっているはずです。
ㅤ
③ - 1: ABC の C 問題のうち、簡単な問題を解いていく
フェーズ ② までは、主に ABC の B 問題を解いていきましたが、フェーズ ③(とフェーズ ④)では、主に C 問題を解いていきます。
ここで悩ましいのは、同じ C 問題でも、難易度の差がとても大きいことです。下の表(AtCoder NoviSteps のコンテスト別問題一覧)に示す通り、易しいものは 4Q 程度、難しいものは 1Q 程度あります。
この難易度差への適切な向き合い方については、競技者のタイプによっても分かれます。
- タイプ 1:難易度差を気にせず、好きな順番でひたすら埋めていく練習方法
- タイプ 2:まず C 問題のうち 4Q のものを埋めて、次に 3Q のものを埋めて...と進める練習方法
もし仮にタイプ 1 の練習方法を苦なくこなせるならば、能力面においても、性格面においても、競プロの素質のある方だと思います。そうであれば、タイプ 1 の方針で差し支えありません。
一方、4Q の問題の解説はなんとか読み解けるが、3Q の問題になると解説を読んでもわからない......という感じであれば、C 問題のうち、まずは 4Q のものを一通り埋めてみましょう。
ㅤ
③ - 2: 計算量を削減する 6 個のテクニックを習得する
ABC の C 問題を解いていくと、提出したプログラムが TLE となることに悩まされるケースが増えてくるはずです。フェーズ ② では、計算量を見積もれるようになっていますが、まだ、計算量を削減するテクニックを学んでいないためです。
フェーズ ③ では、具体的な計算量削減テクニックを習得していきます。下の表に、押さえておくべき 6 個の計算量削減テクニックを示しました。いずれも本記事では解説しませんが、参考資料を付したので、ぜひ読んでみてください。
| テクニック | 問題例 | グレード | 参考資料 |
|---|---|---|---|
| 一部の変数のみを固定して考える | ABC 085 C - Otoshidama | 5Q 〜 | この記事の第 8 問の解説 |
| 繰り返し回数を割り算で求める | ABC 158 B - Count Balls | 5Q 〜 | 問題の解説 |
バケット, set, map を活用する |
NoviSteps 上で問題集を用意しています:バケット, set, map | 5Q 〜 | 特集!知らないと損をする計算量の話 |
| 累積和 | 鉄則本 A06 - How Many Guests? | 4Q 〜 | 累積和を何も考えずに書けるようにする! |
| 二分探索法(の初歩) | 鉄則本 B11 - Binary Search 2 | 4Q 〜 | 二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜 |
| 動的計画法(の初歩) | EDPC A - Frog | 4Q 〜 | 動的計画法超入門! Educational DP Contest の A ~ E 問題の解説と類題集 |
③ - 3: 数学 IA を勉強する
数学に自信のない方は、ぜひ、数学 IA をしっかりとマスターしましょう。とくに、
- 単元「数と式」
- 単元「集合と命題」
- 単元「場合の数と確率」
- 単元「整数・数学と人間の活動」
で学ぶ内容は、競プロに挑む上で必須のスキルとなります。
単元「数と式」で登場するような、式の展開・因数分解といったスキルは、競プロでも盛んに登場します。また、単元「場合の数と確率」の素養がなければ、プログラムの計算量を見積もる際に不自由が発生します。
そして、単元「集合と命題」は特に重要です。フェーズ ③ 以降で登場する問題には、必要条件・十分条件についての理解を求めるものが多数登場します。必要条件・十分条件という言葉の意味がわからないと感じた方は、ぜひ何度も反復して、マスターしましょう。
なお、学校でまだ習っていないものが含まれるかもしれません。特に、単元「整数・数学と人間の活動」は、この段階では未履修の生徒さんが多いでしょう。その場合、先取り学習の意味合いも込めて、チャート式などで目を通しておくとよいと思います。
数学 IIBC については、この段階ではまだ焦って勉強しなくても大丈夫ですが、もし余力があるならば、単元「指数関数・対数関数」「数列」を勉強しておくとよいでしょう。
ㅤ
③ - 4: 自力で解けなかったときには、躊躇することなく解説を読む
競プロの練習をする上で大切なことは、自力で問題が解けなかったときに解説を読むのを躊躇しないことです。一説によると、「競プロの実力は、解説を読んで理解した量に比例する」とも言われています。
とくに、ABC は、競プロの問題を解くのに必要な知識を学ぶための教材として設計されています。知らない手法やテクニックを用いる問題は、そもそも解くことができません。目安として、問題を 15 分程度考えても何も解法が浮かばなかった場合には、解説を読むようにするとよいでしょう。
そして解説を読んでもわからなかったときには、
- sunke さんによる YouTube 上での解説放送を聞いてみる
- 友達に聞いてみる
- 生成 AI に聞いてみる
- もし Twitter(X)をやっていたら、競プロをしている人をフォローして質問してみる
- 問題のタイトルで Google 検索して、有志の人の解説ブログを探してみる
といった方法を試してみましょう。
フェーズ ④(目標 R500, 3Q 〜): アルゴリズムとデータ構造の知識の習得
フェーズ ③ を超えてくると、徐々に「問題を解く喜び」や「解説を読むたびに新たなスキルを入手できる喜び」を感じられるようになってくるはずです。フェーズ ④ では、いよいよ本格的に、アルゴリズムやデータ構造の勉強を始めてみましょう! 学べば学ぶほど解ける問題が増えていく、楽しい時期だと思います。
高 2 冬の JOI 二次予選突破を目指すためには、高 1 の 12 月末までに、フェーズ ④ までを概ねクリアすることが理想です。この場合、フェーズ ④ の途中経過を歩んでいる状態で、高 1 冬の JOI 二次予選を受験することになります。まだ二次予選突破は厳しいですが、それでも来年に向けて「何が足りないのか」の肌感覚を掴んだ状態になります。それは大きな財産となります。
また、この頃になると AtCoder 茶色ランクが見えてくるはずです。AtCoder を目指す者にとって初めてのランクアップです。これをモチベーションにして頑張ってみましょう。
ㅤ
④ - 1: アルゴリズムや競プロ関連の書籍を買ってみる
フェーズ ④ まで来たら、そろそろアルゴリズムや競プロ関連の書籍を買ってみてもいいと思います(もちろん、その前段階で買ってもいいです)。手元に置いておくだけでも、「世の中にはどんなアルゴリズムやデータ構造があるのか」の一覧を見ることができるので、今後の学習の指針になります。たとえば、
- 『競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77の技術~』(通称、鉄則本)
- 『プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~』(通称、蟻本)
- 『問題解決力を鍛える! アルゴリズムとデータ構造』(通称、けんちょん本)
といった書籍を手元に置いてみましょう。
ㅤ
④ - 2: ABC の C 問題を埋めながら、未知のアルゴリズムを勉強する
フェーズ ③ と同様に、ABC の C 問題をレベルアップしながら埋めていきましょう。特に 3Q 以降の問題を埋め始めると、下の表に挙げるアルゴリズムやデータ構造が登場します。
オススメの練習方法は、問題の解説を読んで未知のアルゴリズムが出てきたとき、そのタイミングでそのアルゴリズムを勉強することです。
| アルゴリズムとデータ構造 | グレード | 参考資料 |
|---|---|---|
| 素数判定法 | 5Q 〜 | AtCoder 版!マスター・オブ・整数 (素因数分解編) |
| ビット全探索 | 3Q 〜 | ビット全探索 |
| 順列全探索 | 3Q 〜 | たのしい探索アルゴリズムの世界【前編:全探索、bit全探索から半分全列挙まで】 |
| 再帰関数を用いた全探索 | 3Q 〜 | たのしい探索アルゴリズムの世界【前編:全探索、bit全探索から半分全列挙まで】 |
| 動的計画法(ナップサック問題を解くもの) | 3Q 〜 | 典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ |
| 二分探索法(本格的なもの) | 3Q 〜 | 二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜 |
| しゃくとり法 | 3Q 〜 | しゃくとり法 (尺取り法) の解説と、それを用いる問題のまとめ |
| 深さ優先探索法(DFS) | 3Q 〜 | DFS (深さ優先探索) 超入門! 〜 グラフ・アルゴリズムの世界への入口 〜【前編】 |
| 幅優先探索法(BFS) | 3Q 〜 | BFS (幅優先探索) 超入門! 〜 キューを鮮やかに使いこなす 〜 |
| Union-Find | 3Q 〜 | Union-Find木の解説と例題 |
| いもす法 | 3Q 〜 | いもす法 |
| べき乗を高速に計算する手法 | 3Q 〜 | 「998244353 で割ったあまり」の求め方を総特集! 〜 逆元から離散対数まで 〜 |
| 逆元を高速に計算する手法 | 2Q 〜 | 「998244353 で割ったあまり」の求め方を総特集! 〜 逆元から離散対数まで 〜 |
| ダイクストラ法 | 2Q 〜 | 最短経路問題総特集!!!~BFSから拡張ダイクストラまで~ |
| ワーシャル・フロイド法 | 2Q 〜 | 最短経路問題総特集!!!~BFSから拡張ダイクストラまで~ |
| クラスカル法 | 2Q 〜 | クラスカル法による最小全域木を求めるアルゴリズム |
なお、これらのアルゴリズムとデータ構造は、次の記事中でも「12 個の基本アルゴリズム」として触れられています。
この記事では、12 個の基本アルゴリズムを学ぶための 100 問の練習問題も掲載されています。必要に応じて、これらの練習問題にも取り組んでみましょう。
ㅤ
フェーズ ⑤(目標 R800, 2Q 〜): 応用力の育成
フェーズ ④ をクリアしたら、いよいよフェーズ ⑤ に進んで、AtCoder 緑色を目指しましょう。
フェーズ ⑤ の課題は、フェーズ ④ で身につけたアルゴリズムとデータ構造の知識を応用して、より難しい問題が解けるようになることです。といっても、フェーズ ③, ④ をクリアした者にとっては、フェーズ ⑤ でもやるべき練習方法は基本的に一緒です。
高 2 冬の JOI 二次予選突破を目指すためには、高 2 の夏休み前までには、フェーズ ⑤ をクリアしたいところです。次のフェーズ ⑥ は、フェーズ ③ と同様に、腰を据えてじっくり取り組む必要があるからです。
ㅤ
⑤ - 1: ABC 212 〜 の C 問題をすべて埋める
フェーズ ⑤ に到達する頃には、ABC の C 問題の半数以上が解けるようになっているはずです。ここで、いよいよ「詰め」に取り掛かりましょう。ABC の C 問題を徹底的に埋めるのです。
ただし、2025 年現在、ABC はすでに 400 回以上開催されていることに注意しましょう。必ずしも、すべての回の問題を解く必要はありません。ABC のコンセプトは時期によって変遷しており、概ね次のように分類できます。
| 時期 | ABC の開催回 | 時代背景 |
|---|---|---|
| 最古期(2012 〜 2016 年) | ABC 001 〜 041 | AtCoder のレーティングシステムが始まる前のものであり、現在の水準の徹底した問題の品質管理はなされていません |
| 黎明期(2016 〜 2019 年) | ABC 042 〜 125 | 中級者向けコンテスト ARC と同時開催の時期のものです。そのため、考察を問うような問題が一部混ざっており、現在の ABC とは問題の傾向が多少異なります |
| 6 問制時代(2019 〜 2021 年) | ABC 126 〜 211 | ABC と ARC とが分離されたものの、まだ ABC の明確なコンセプトは誕生していませんでした |
| 8 問制時代(2021 〜 2023 年) | ABC 212 〜 318 | 「ABC は競プロに必要な知識を学ぶ教材である」という明確なコンセプトの下で開催された時期です |
| 7 問制時代(2023 〜 現在) | ABC 319 〜 | 8 問制時代のコンセプトの 2 週目を回している時期です |
8 問制時代の ABC 212 〜 318 は、このおよそ 100 回分の ABC によって「競プロに必要な知識を一通り学ぶことができる教材」が形成されるように設計されました9。そして、7 問制時代の ABC 319 〜 は、8 問制時代に扱った知識を再び扱っているとのことです。
したがって、ABC の過去問のうち優先的に解くべきなのは、「ABC 212 〜 318」と「ABC 319 〜」です。
なお、問題を埋めていくうちに、全く新しい問題であっても「似たような問題を過去にやったな......」と感じることが増えてくるはずです。そうなることが理想的です。
たとえば、教材 1 巡目の「ABC 212 〜 318」の問題については、少しでも解法がわからなかったらすぐ解説を読むようにして埋めていき、教材 2 巡目の「ABC 319 〜 現在」の問題については、学んだ知識を引き出す練習をするために、少し粘ってみるという練習方法も考えられます。
このような練習がしやすいように、AtCoder NoviSteps では、「ABC 212 〜 318」の問題一覧表と、「ABC 319 〜 現在」の問題一覧表とを分けて表示しています。
ㅤ
⑤ - 2: ABC の D 問題を埋め始める
ABC の C 問題を埋めたら、次はいよいよ D 問題に取り掛かりましょう。やり方は、C 問題のときと同様です。ABC 212 〜 の D 問題を、解けるものからドンドン埋めていきましょう。
ㅤ
⑤ - 3: 問題を分解して理解する
フェーズ ⑤ で解くような 2Q の問題は、3Q で学ぶ基礎的なアルゴリズムの知識を応用したり、組み合わせたりできるかを問うものが多くあります。たとえば、
- ナップサック問題(3Q)に対して、ナップサックに入れることのできる品物の個数が $K$ 個以内といった制約が加わるもの
- 重みのないグラフ上で 2 点 $s, t$ 間の最短路を求める問題(3Q)に対して、始点が複数個になったり(多始点 BFS)、そもそも問題の見た目がグラフではなく、グラフの問題として考える部分にハードルがあったりするもの
- いもす法で解ける問題(3Q)に対して、区間の両端の値が $10^5$ 程度であったものが $10^9$ 程度になるため、座標圧縮も必要とするもの
- 「1 つの変数を固定する」「累積和をとる」「二分探索する」といった基礎的なスキルを組み合わせて解くもの
といった具合です。このような問題をマスターするためには、問題を基礎的なパーツに分解して理解したり、「基礎的な知識」と「応用部分」とに分離して理解したりする作業が有効です。
ㅤ
⑤ - 4: 実装を洗練させる練習をする
フェーズ ⑤ で解くような 2Q の問題になると、3Q までよりも実装が複雑な問題が多くなります。たとえば、ビット全探索を使う問題は 3Q から登場しますが、2Q になると同じビット全探索を使う問題でも実装がより複雑になるという具合です。問題の理解が甘いと、細部の実装でミスが起こりやすくなります。
問題をよく理解した上で、「このような処理はこのように実装する」というような型を 1 つ 1 つ習得していく練習が有効です。そのためには、AC できた問題についても、上位陣のソースコードを読んで、より楽な実装方法がないか検討していきましょう。
なお、洗練した実装ができることは、今後より高度な問題を解くための重要な基礎になります。
ㅤ
⑤ - 5: 数学 IA をいよいよマスターする
実は、フェーズ ⑤(AtCoder 茶色)までは、数学 IA の理解が不十分であっても到達可能だと思います。
chokudai さんによる記事「AtCoder(競技プログラミング)の色・ランクと実力評価、問題例」によると、AtCoder 茶色になるためには、基礎的なプログラミング能力に加えて、
- MARCH 理系学部以上に入れる程度の数学力
- 典型アルゴリズムに関する知識
- 素早く正確な実装ができること
のいずれかを持つことが必要であるとされています。そして、AtCoder 茶色に到達する人の有するスキルはバラバラであり、数学力で到達した人もいれば、アルゴリズムの知識で到達した人もいれば、素早く正確な実装力で到達した人もいるとのことです。
一方、フェーズ ⑤(AtCoder 茶色)をクリアしてフェーズ ⑥(AtCoder 緑色)へ進むためには、上記の 3 つの能力をある程度揃える必要があります。数学 IA の理解に穴があると感じる場合には(具体的には、チャート式の ★★★☆☆ 以下の難易度で解けない問題がある場合には)、ぜひこの機会にマスターするとよいと思います。
ㅤ
フェーズ ⑥(目標 R1200, 1Q 〜 1D): 圧倒的に問題を解きまくる
フェーズ ⑤ をクリアして AtCoder 緑色になったら、いよいよ目標とする JOI 二次予選突破が現実味を帯びてきます。
フェーズ ⑥ の目標は、これまでよりも一層たくさんの問題を解いて、アルゴリズムの理解を深めたり、実装力を進化させたりすることです。十分な練度に到達して、弱点をつぶし、コンテストに慣れていけば、AtCoder 水色にもなれるでしょう。
高 2 冬の JOI 二次予選突破を目指すためには、高 2 の夏休みをフェーズ ⑥ の練習に充てられると理想的です。
ㅤ
⑥ - 1: ABC 212 〜 の D 問題, E 問題を埋める
フェーズ ⑥ まで来ると、問題を解いて解法を吸収するノウハウが十分に蓄積されてきているはずです。その調子で、ABC 212 〜 の D 問題はすべて埋めてしまいましょう。さらに、JOI に特化した実践的な訓練へと移行する前に、E 問題もできるだけ多く解いておくとよいでしょう。
問題を解いて解法を吸収する際には、これまでと同様に
- 解けない問題は、解説を読んでよく理解する
- 問題の解法を、パーツごとに分解して理解する
- AC できた問題も、上位陣のソースコードを読んで、より楽な実装方法を検討する
といったことを意識して取り組んでいきましょう。
ㅤ
⑥ - 2: Educational DP Contest(EDPC)の問題を解く
Educational DP Contest(EDPC)とは、動的計画法(DP)を適用して解ける典型的な問題を集めたコンテストです。このコンテストの過去問のうち、1Q 以下の問題については最低限解いて、余裕があれば 1D の問題も解いてみましょう。
また、同様のコンセプトのコンテストとして、Typical DP Contest(TDPC)もあります。こちらも併せて解いていきましょう。
これらの問題を解いておくと、ABC の D 問題や E 問題を解く際に、「これは TDPC でみたやつだ」と反応できる機会が多くなります。特に、JOI では DP の問題は多く出題されるため、DP は確実にマスターしたいところです。
ㅤ
⑥ - 3: 貪欲法(Greedy)に慣れる
JOI において、DP と並んでよく出題されるのは、Greedy 解法で解ける問題です。特に、JOI 二次予選の通過を決めるラインの難易度の問題において、 Greedy に基づく議論を要するものは数多く見られます。
Greedy 解法で解ける問題の特徴は、易しい問題であれば直感のみに頼って解くこともできるが、難しい問題では直感のみに頼ると誤った解法を導きやすいことです。このような問題の練習で大切なことは、「なんとなく正しそうだ」という直感のみで済ませるのではなく、Greedy 解法によって最適解が導かれることの証明をきちんと理解することです。
なお、Greedy 解法の証明に慣れることは、JOI に限らず、今後より高度な競プロの問題に挑む際にも重要な基礎となります。AtCoder NoviSteps では、貪欲法を集中的に練習できる問題集を提供しています。ぜひ練習してみてください。
- 問題集「貪欲法(greedy method)」
- サブ問題集「貪欲法:うまい評価関数を見つける」
- サブ問題集「貪欲法:交換しても悪化しない」
- サブ問題集「貪欲法:後によいものを残す」
- サブ問題集「貪欲法:辞書順最小のものを求める」
ㅤ
⑥ - 4: 考察の流れを掴めるようにする
NoviSteps 1Q 〜 1D 相当の難易度の問題になると、1 ステップの考察で解けることはあまりなく、複数ステップの考察を必要とすることがよくあります。
このような問題に挑むときには、考察の流れを掴むことが大切です。よくある失敗例は、「習い覚えた解法を問題に適用できないかと、ひたすら問題とのマッチングを試みてしまう」という解法ガチャ戦法によって生じます。複数ステップの考察を必要とする問題では、解法パターンの組合せが爆発的に増大していくため、上記のような解法ガチャ戦法が通用しないケースが増えるのです。
典型的な考察の流れとしては、以下のものがあります。このような流れを意識することで、少しずつ問題の解法を見通せるようになっていくはずです。
- まずは $O(N^2)$ の計算量の解法を考えて(ここまでは 2Q 相当)、それを $O(N)$ や $O(N \log N)$ の計算量の解法へと改善する
- ある変数を固定すると、その変数を固定したあとのサブ問題は 2Q 相当の解法で解ける(どの変数を固定するとよいかを見通すことがしばしば難しい)
- 問題文で与えられた条件は複雑なので、より扱いやすいような、数学的に等価な条件に言い換えていく
前者の例としては、たとえば素朴な動的計画法によって $O(N^2)$ の計算量の解法が生まれ、それを累積和を用いて $O(N)$ へと高速化するなどがよく見られます。
特に JOI では、素朴な解法でも満点はとれなくても、部分点をとれることがよくあります。「限られた競技時間内でいかに部分点を多くとるか」という戦略を極めることも、JOI においては非常に大切です。
ㅤ
⑥ - 5: 弱点をなくす
ここまでの取り組みをした上で AtCoder 水色になるためには、
- より高度な問題を時々解けるようにすること
- 「数学力」「アルゴリズムの知識」「実装力」のどれをとっても隙のない状態にすること
のうちのどちらかが必要です。
ただし、隙があると後々辛いことになるケースも多いため、いずれにせよ後者の取り組みをするのがよいだろうと思います。人によって、レーティングが伸び悩む原因は異なります。自分の弱点を正しく掴んで対策することがとても大切になってきます。
数学力が不足していたらチャート式などで勉強したり、アルゴリズムの知識が不足していたらもっと多くの問題を解いたり、実装力が不足していたら上位陣のソースコードから学ぶ習慣を磨き上げたりなど、それぞれの対策をとっていきましょう。
ㅤ
⑥ - 6: JOI の過去問を解きまくる
ここまでしっかり対策したら、いよいよ JOI 二次予選に向けた実践練習を積んでいきましょう。高 2 の 10 月頃には、JOI に特化した練習を積める状態にすることが理想的です。
JOI では、これまでに 500 問以上の問題が出題されています。また、有志によって、JOI の過去問の難易度は 12 段階で評価されています。JOI の問題を集めたサイトとしては、次のものが有名です。
ㅤ
なお、NoviSteps のグレードと、AtCoder-JOI の難易度の換算は、概ね次のようになっています。
| グレード | JOI 難易度 |
|---|---|
| 10Q | 難易度 1 易しめ |
| 9Q | 難易度 1 難しめ |
| 8Q | 難易度 2 易しめ |
| 7Q | 難易度 2 難しめ |
| 6Q | 難易度 3 易しめ |
| 5Q | 難易度 3 難しめ |
| 4Q | 難易度 4 |
| 3Q | 難易度 5 易しめ |
| 2Q | 難易度 5 難しめ 〜 難易度 6 易しめ |
| 1Q | 難易度 6 難しめ 〜 難易度 7 易しめ |
| 1D | 難易度 7 難しめ 〜 難易度 8 易しめ |
| 2D | 難易度 8 難しめ 〜 難易度 9 易しめ |
| 3D | 難易度 9 難しめ 〜 難易度 10 易しめ |
| 4D | 難易度 10 難しめ 〜 難易度 11 易しめ |
| 5D | 難易度 11 難しめ 〜 難易度 12 易しめ |
| 6D | 難易度 12 難しめ 〜 |
JOI 二次予選を突破するためには、難易度 7 程度を安定して解ける状態を目指したいところです。それに加えて、
- 難易度 9 〜 12 のような難しい問題からも、部分点をもぎ取る練習をすること
- 本番さながらのバーチャルコンテストを実施して、時間配分の感覚を磨くこと
をぜひやっておきましょう。
なお、JOI を目指す高校生でなくても、JOI の問題を解いていくことは、実装力を身につける上で大変有効です。
ㅤ
フェーズ ⑦ : 競プロを極める!
フェーズ ⑥ までは、競プロを全くやらない人であっても、IT に関わる者であれば到達して損はないと言えるものでした。一方、フェーズ ⑦ から先は、競プロそれ自体の道を極めていく世界になります。
このフェーズに向けた資料としては、次のような記事があります。
ぜひ、楽しい競プロライフを送っていきましょう!
ㅤ
3: おわりに
JOI は生徒たちの人生の可能性を大きく切り拓いてくれるものだと感じています。これから少しでも、JOI をやってみたいと思う生徒さんや、JOI をいいものだと感じて普及活動に取り組む先生方が増えていくと嬉しいです。そして、JOI に関わる方々がより幸せに生きられるようにと願っています。
-
なお、JOI 全体の参加人数は 2021 年以降急増しており、JOI 2020 の参加者数は 1311 名であったのに対して、JOI 2025 の参加者数は 3136 名でした。また、JOI 2025 は、史上初めて 47 都道府県全てから 1 名以上の参加者が誕生するという、歴史的快挙を成し遂げました 🎉 ↩
-
余談ですが、Qiita への記事投稿をキッカケに書籍を出版したという話はたくさん聞いています。Qiita は技術系の商業出版を志す人々にとって、登竜門的存在になっているといってよいでしょう。 ↩
-
大分県立大分舞鶴高等学校においても、最初の 1 名の生徒さんの頑張りが部活動の発展に大きく寄与しました。いかにそのような生徒と出会えるかも、学校への JOI 普及にとって大切なテーマかもしれません。 ↩
-
個人情報保護の観点から、一部学校名を伏せています。 ↩
-
そんな取り組みの様子は、「高等学校における数理・データサイエンス・AI教育の実現を目指した教材開発及び科学部情報班の歩み」で報告されています。なお、都立 A 高校においてもそうでしたが、普段から生徒さんのことをよく見ている教員の「生徒の素質を見抜く力」は本当にすごいものだと、いつも実感します。 ↩
-
JOI のルールは毎年変更がなされるので、その時々のルールをご確認ください。しかしながら、多くの場合、JOI は勝ち進むほどに、C++ がデファクトスタンダードとなっていく傾向は変わりません。世界大会である IOI においてそうであるためです。 ↩
-
AtCoder の過去問は年々増加しているため、多くの生徒にとって過剰な問題数があります。各フェーズの問題をすべて解くことにこだわる必要はありません。十分習得できたと感じたら、そのフェーズの問題が残っていても、次のフェーズに進んで良いでしょう。 ↩
-
フェーズ ③ で感じる壁の高さは、生徒さんの数学力に大きく依存します。最難関の中学受験を突破した生徒にとっては、多少のプログラミングの知識を学んだ上で、計算量という概念を知ってしまえば、容易にフェーズ ③ を超えられることも多いです。しかしながら、大半の生徒さんにとって、このフェーズ ③ が大きな壁であり、ここを超えられるかどうかでその後の競プロ人生が大きく変わるといっても過言ではありません。 ↩
-
AtCoder 社の rng_58 さんから直接聞いた話です。この教材は、競技プログラミング教室で実際に活用されています。 ↩











