HOME > 情報オリンピックの出題内容や勉強法を紹介!

情報オリンピックの出題内容や勉強法を紹介!

情報オリンピックは高校生以下を対象としたプログラミングコンテストです。プログラミングを使って、時間内により多くの問題を解くことを目指します。このような分野は競技プログラミングとも呼ばれています。

このページでは、情報オリンピックにまつわる「どんな問題が出るの?」「どうやって勉強すればいいの?」といった皆さんの疑問を解決します。

情報オリンピックの過去問を見てみよう

実際にどのような問題が出題されているのでしょうか。まずは日本情報オリンピック (JOI) の過去問を見てみましょう。

水道料金

2014 年 12 月実施・JOI 2014/2015 予選 問題1 (改)

問題文

あなたが住んでいる地域には水道会社が X 社と Y 社の 2 つあります。2 つの会社の 1 ヶ月の水道料金は、1 ヶ月の水道の使用量に応じて次のように決まります。

  • X 社:1 リットル あたり A 円かかる。
  • Y 社:基本料金は B 円である。使用量が C リットル以下ならば、料金は基本料金 B 円のみがかかる。使用量が C リットルを超えると基本料金 B 円に加えて追加料金がかかる。追加料金は使用量が C リットルを 1 リットル超えるごとに D 円である。

あなたの家では 1 ヶ月の水道の使用量が P リットルであるとします。水道料金ができるだけ安くなるように水道会社を選ぶとき、家の 1 ヶ月の水道料金をいくらになるでしょうか。


ただし、A,B,C,D,P はすべて 1 以上 10000 の整数とします。

入力

入力は 5 行とし、各行の内容は上から順に A,B,C,D,P とします。

出力

家の 1 ヶ月の水道料金を出力してください。

数年前の電力自由化に伴い、電気料金を比較するウェブページを見たことがある人も多いのではないでしょうか。それと似たような設定の問題です。

例えば、次のような入力を考えてみましょう。

9
100
20
3
10

つまり、あなたの家では P=10 リットルの水が使われています。よって、X 社の水道料金は A×P=9×10=90 円です。対して、使用量が C=20 リットル以下なので、Y 社の水道料金は基本料金のみの B=100 円になります。安いのは X 社の 90 円なので、

90

とプログラムが出力しなければなりません。

この問題の解答プログラムを実際に作成してみました。次のテキストエリアに様々な入力を入れて、プログラムが正しく動作している様子を感じてください。


このような問題は手計算で解決することも可能なとても簡単なものです。しかし、どんな入力に対してもすぐに答えを求めてくれるプログラム、いわばこの問題専用の電卓のようなものを作成することが求められています。

出題形式のまとめ

  • 情報オリンピックでは現実世界と関連した設定の問題も多く出題されています。
  • どんな入力が与えられても正しい答えを求めることができる「プログラム」を作成する必要があります。

情報オリンピックの流れ

現在、日本に在住する皆さんが参加できる可能性があるのは、

  • 日本情報オリンピック (JOI = Japanese Olympiad in Informatics)
  • 日本情報オリンピック女性部門 (JOIG = Japanese Olympiad in Informatics for Girls)
  • 国際情報オリンピック (IOI = International Olympiad in Informatics)
  • ヨーロッパ女子情報オリンピック (EGOI = European Girls’ Olympiad in Informatics)
  • アジア太平洋情報オリンピック (APIO = Asia-Pacific Informatics Olympiad)

の 5 つです。この中でも JOI と IOI の流れを紹介します。

JOI は、一次予選、二次予選、本選、春季トレーニングの 4 つのコンテストで構成されています。

JOI 一次予選

一次予選は誰でも参加することができます。一次予選は 9 月、10 月、11 月の 3 回実施されています。何度でも参加でき、いずれか 1 回で良い成績を収めれば大丈夫です。

具体的には、80 分で 4 問の課題に取り組みます。3 問以上解くことができると「繰り返しを含む基本的なプログラムを適切に書くことができる者」として認定され、敢闘賞が授与されます。また、二次予選に進出することができます。

一次予選はオンラインで開催されています。学校のコンピュータ室や自宅から無料で参加できます。

一次予選では基本的なプログラミングスキルが問われています。まずはプログラミング言語を 1 つ使いこなせるようになりましょう。一次予選では 60 種類以上のプログラミング言語の中から自由に選ぶことができます。

JOI 二次予選

二次予選は 12 月に実施されていて、3 時間で 5 問に取り組みます。上位に入るなど特定の条件を満たすと、本選に進出することができます。

一次予選ではプログラミングスキルが問われていたのに対し、二次予選以降ではアルゴリズムデータ構造の知識と発想も問われてきます。例えば、日本語でどんなに難しい単語や表現を知っていても、良い文章が書けるとは限りませんよね。プログラムはコンピュータに対する指示で、プログラミング言語はその指示を表すための言葉です。プログラミング言語についていくら詳しくても、肝心な指示の中身が間違っていたり、効率が悪いと、二次予選以降を勝ち抜くのは難しくなってきます。

JOI 本選

本選は通常 2 月に実施されていて、4 時間で 5 問に取り組みます。上位者は春季トレーニングに招待されます。
本選では二次予選と比べて難しいアルゴリズムの知識や、そのアルゴリズムを与えられた課題に適用させるための高度な発想力が問われます。

JOI 春季トレーニング

春季トレーニングは IOI 日本代表を決めるための代表選抜会です。3 月に実施されていて、4 日間連続で毎日 5 時間の競技に取り組みます。上位 4 人は IOI 日本代表として派遣されることになります。

なお、春季トレーニングで使えるプログラミング言語は C++ のみです。


JOI 2020/2021 春季トレーニングの様子

IOI

日本代表となった 4 人は IOI に参加します。80 以上の国と地域から参加する 300 人以上の選手と腕を競い合います。競技は 2 日間ですが、中日にはエクスカーションなども実施されています。

IOI 中の様子は、例えば IOI 2019 写真速報 で見ることができます。

IOI 2019 アゼルバイジャン大会 写真速報

情報オリンピックに向けた勉強法・教材

JOI 入門講座に参加しよう

情報オリンピック日本委員会では、プログラミング未経験者や初心者を対象として JOI 入門講座を毎月実施しています。プログラミングの始め方から丁寧に解説します。少人数グループに 1 人ずつ学生チューターが割り当てられて、個別に指導を受けることができます。また、レベル別で 3 つのコースを用意していて、とても参加しやすくなっています。

JOI 入門講座|一緒にプログラミングを学んでコンテストに参加しよう!

レギオに参加しよう

情報オリンピック日本委員会では、各地の大学の先生方とコラボして、毎年夏休み期間中に、日本情報オリンピック予選参加をめざす中高生を対象に、プログラミングとアルゴリズムの基礎的な講習会「レギオ」を開催しています。

レギオ|地域密着型の学習支援講習会

夏季・春季セミナーに参加しよう

情報オリンピック日本委員会では、プログラミングをある程度マスターした中高生を対象として、アルゴリズムの指導を行う夏季セミナー(8月)と春季セミナー(3月)を実施しています。
・春季セミナー(2024年3月)の概要はこちら(イベント管理サービス「peatix」のサイトに遷移します)
・夏季セミナー(2023年8月)の概要はこちら(イベント管理サービス「peatix」のサイトに遷移します)
・夏季セミナー(2023年8月)での講演資料はこちら

JOI 夏季セミナー 2021

過去問を解いてみよう

プログラミングサイト AtCoder において、JOI 過去問 のオンラインジャッジ (自動採点システム) が無料で公開されています。JOI の予選も AtCoder で実施されているため、実際の競技のシステムに予め慣れておくことができます。

また、有志によって JOI 過去問に非公式の難易度を付ける取り組みも行われており、ウェブページ AOJ/AtCoder-JOI において難易度順で問題に取り組むことができます。

過去問の原本と多くの問題の解説は情報オリンピック日本委員会のウェブサイトで閲覧できます。

JOI 過去問&解説

書籍を活用しよう

以下は、プログラミングがある程度できることを前提として、プログラミングをどう使えば問題が解決できるか、つまりアルゴリズムについて説明している書籍です。一次予選の問題が解けるようになったら取り組んでみましょう。

情報オリンピックに挑戦しよう!

プログラミングの勉強を始めたら、まずは JOI の一次予選に参加してみましょう。易しい問題も含まれていますし、参加料は無料です。

参加の申し込みは情報オリンピック日本委員会のウェブサイトから行ってください。