プログラミングを勉強している方の中には、「競技プログラミング」に興味のある方も多いかと思います。
競技プログラミングとは、プログラミング問題を制限時間内に解いて競い合う競技です。競技と言われると「難しそう」「ベテランの経験者向けなのでは」と思われるかもしれませんが、初心者向けの問題が出題されることもあり、ゲーム感覚で楽しく挑戦できるためプログラミングの勉強を始めたばかりの方にもオススメです。
ただ、中には「どうやって競技プログラミングの練習をしたらよいかわからない」「競技プログラミングに挑戦してみたけどなかなか問題が解けなかった」という方もいるでしょう。
この記事では、競技プログラミングの練習に使える6つの問題集をご紹介します。「競技プログラミングを始めてみたい」「競技プログラミングを始めたばかりなので問題を解く練習がしたい」という方はぜひ参考にしてください。
【目次】
競技プログラミングとは
競技プログラミングとは、主催から出題された問題を制限時間以内に参加者が解いて競い合う競技です。ルールや前提条件などは、大会やサイトなどによって異なります。基本的には問題の正解数やコードの作成時間などを競い合い、制限時間は1、2時間程度で終わるものもあれば、1日がかりとなる場合もあります。また中には「コードゴルフ」と呼ばれる、コードの短さを競う競技もあります。
問題内容も条件分岐や繰り返しなどが理解できていれば解ける初心者向けのものから、Web開発やデータ分析、機械学習などといった高度な専門知識が求められるものまでさまざまです。
たとえば有名な日本の競技プログラミングサイトである「Atcoder」では、毎週土曜日に「AtCoder Beginner Contest」という初心者向けのコンテストが実施されています。
初めて競技プログラミングに挑戦する場合、まずはこうした初心者向けと明示されているコンテストから参加してみるのがオススメです。何度か初心者向けに参加して、慣れてきたら少しずつ難易度の高い問題に挑戦していけば、無理なくスキルアップできるでしょう。
競技プログラミングに必要な練習とは
プログラミングの勉強を始めたばかりの人がいきなり競技プログラミングに挑戦すると、問題の意味や解き方がよくわからずにつまずいてしまうかもしれません。事前に以下のような練習をしておくと、本番でもスムーズに問題を解くことができるでしょう。
1.プログラミング問題を解く練習
まずは基本的なことですが、プログラミング問題を解く練習から始めましょう。
競技プログラミングでは、たとえば
整数 A, B, C が与えられます。式 A × B ≦ C が成立している場合はYESを、そうではない場合はNOを出力してください。
といった問題に対し、制限時間以内に条件を満たすコードを書いて提出をすることが求められます。
さまざまな初心者向けの練習問題に挑戦すると、「初めて見たプログラミング問題を解くこと」にも少しずつ慣れていくはずです。
2.制限時間以内にプログラミング問題を解く練習
前述の通り、競技プログラミングには制限時間が設けられています。正しいコードが書けても、時間がかかりすぎてしまうと失格になってしまいます。
プログラミング問題を解くことに慣れてきたら、タイマーなどを使って本番と同様に時間を測りながら素早く解く練習も行いましょう。
なおpaizaのスキルチェック問題では、問題ごとに想定解答時間・制限時間を記載しています。
競技プログラミングのように制限時間を超えると0点となってしまうため、最初は制限時間以内にコードを書ききることを目指してください。また問題をいくつか解いて慣れてきたら、想定解答時間以内での解答を目指しましょう。
このように時間を意識した練習をしておけば、本番での時間オーバーを防ぐことができます。
競技プログラミングがはじめての方にオススメの練習問題集
競技プログラミングに初めて挑戦する方、プログラミングの勉強を始めたばかりの方は、paizaラーニングの「レベルアップ問題集」で以下の問題集に挑戦してみるのがオススメです。簡単な問題を解く練習をしながら、同時にプログラミングの基礎も学ぶことができます。Dランクレベルアップメニュー
paizaでは、プログラミング問題を解くことで自分のスキルのレベルがわかる「スキルチェック問題」を公開しています。スキルチェック問題はS・A・B・C・Dのランクにわかれており、解いた結果によってS・A・B・C・D・Eという6段階のランクを取得できます。
Dランクレベルアップメニューはもっとも初心者向けのDランク取得を目指すための問題集で、プログラミングの基礎的な文法を総合的に練習できます。
【問題】 文字列 paiza を出力してください。
最初は上記のような問題から始まりますので、まったくのプログラミング未経験から競技プログラミングを始めたい方でも無理なく挑戦できます。逆にスキルチェック問題でDランクを取得済みの方や、プログラミングの勉強が進んでいる方には簡単すぎるかと思いますので、その場合は次以降にご紹介する問題集から挑戦するのがオススメです。
条件分岐メニュー
条件分岐とは、たとえば「入力された年号がうるう年の場合は"yes"を表示し、うるう年でない場合は"no"を表示する」など、条件を指定して実行する処理を分岐させたいときに使う制御構造です。条件分岐はどの言語を使う場合も共通するプログラミングの基礎的な概念で、競技プログラミングの問題を解く際にもよく使用します。もちろん開発業務でのプログラミングでも頻繁に活用するため、早い段階で習得しておけるとよいでしょう。
【問題】 整数 N が与えられます。Nが 0 ではない場合はYESを、 0 である場合はNOを出力してください。
条件分岐メニューではたとえば上記のような問題が出題され、if文や論理式といった条件分岐の扱い方、条件分岐を使った問題の解き方が練習できます。条件分岐が苦手な競技プログラミング初心者の方、条件分岐の理解をさらに深めたい方にオススメです。
ループメニュー
ループとは、たとえば「入力された値から0までの数字をカウントダウン方式で表示する」など、指定の条件を満たすまで繰り返し処理を実行させたいときに使う制御構造です。同じ処理を何度も手作業で書くのは効率が悪くて大変ですし、コードが膨大な量になってしまうでしょう。また手作業で何度も同じコードを書いていると、どこかでミスが起きてしまうかもしれません。しかしループを使えば、処理を一度書くだけで「入力された値から0まで」といった条件を満たすまで繰り返し実行させることができるのです。
ループも条件分岐と同じくプログラミングの基礎的な概念で、実務ではもちろん競技プログラミングの問題を解く際にもよく使用します。問題なく使いこなせるようになることを目指しましょう。
【問題】 長さ N の数列 a (a_1, a_2, ..., a_N) が与えられます。 この数列の和を計算し、出力してください。
ループメニューではたとえば上記のような問題が出題され、for文やwhile文などどいったループの処理を練習して、簡単なループ処理を自分で実装できるようになります。ループが苦手な競技プログラミング初心者の方、ループの理解をさらに深めたい方にオススメです。
競技プログラミングの練習にオススメの問題集
競技プログラミングには、さまざまなアルゴリズムの知識が必要となります。paizaラーニングの「レベルアップ問題集」では、各アルゴリズムを使った問題も公開してます。とくに競技プログラミング初心者にオススメの問題集をご紹介しますので、ぜひ挑戦してみてください。定番アルゴリズムの習得
まずは競技プログラミングで使う機会の多い、探索やソートといった基礎的なアルゴリズムを練習しましょう。
探索は複数のデータの中から特定の条件に一致した値を探すとき、ソートはデータを昇順または降順に並び替えるときに使うアルゴリズムです。
【問題】 整数 n と、数列 a_1, ... , a_n と、整数 k が与えられます。 整数 k が数列の何番目にあるかを求めてください。なお、最初の要素 (a_1) を 1 番目とします。
たとえば線形探索メニューでは、上記のような問題が出題されます。このような「条件にあうデータが配列の何番目にあるか探してください」「条件にあわせてデータを並び替えてください」といった問題は、競技プログラミングでもよく出題されます。
初心者の場合、まずは線形探索・二部探索・挿入ソート・選択ソートといった初歩的なアルゴリズムのメニューから始めましょう。そして慣れてきたら、徐々に幅優先探索・深さ優先探索・マージソート・クイックソートなどといった効率的なアルゴリズムを学んでいくのがオススメです。
定番グラフアルゴリズムの習得
グラフとは、簡単に言うといくつかの頂点とそのうち2つの頂点を結ぶ辺の集合のことです。このグラフを使った問題も競技プログラミングでは多く出題されます。
グラフを使う問題では、たとえば条件にあった最短経路などを探す問題がよく出題されます。ただし最短経路を探すためのアルゴリズムにはさまざまな種類があり、難易度が非常に高いものも少なくありません。
【問題】 整数 n と、n 個の文字列 s_1, s_2, ..., s_n が与えられます。 これらすべての文字列をちょうど 1 回ずつ使用して、しりとりをすることができるかどうか判定してください。
グラフ構造の入力メニューでは、たとえば上記のような問題が出題されます。初心者の場合、まずはグラフ構造の入力メニューから始めてグラフの構造を理解し、入出力や隣接行列や隣接リストの実装ができるようになることを目指しましょう。
テキストや文字列処理の習得
文字列処理に関する問題も、競技プログラミングでよく出題される傾向にあります。
初心者の場合、まずは正規表現についての理解を深めましょう。正規表現とは、簡単に言うと文字列のパターンを表現するための文字列です。たとえば'p..za'という正規表現には、文字列'paiza'や'pizza'などがあてはまります。こうした正規表現は、曖昧な文字列を検索したいときなどに活用できます。
【問題】 文字列 S が与えられるので、正規表現を用いて以下のパターンが何文字目から出現するかを求めてください。 パターン: 文字列 paiza
正規表現メニューでは、たとえば上記のような問題が出題されます。正規表現が理解できたら、次はトライ木メニューに挑戦して単語の検索や削除ができるようになることを目指すとよいでしょう。
なお文字列処理では探索やソートのアルゴリズムの理解も必要となるため、並行して練習を進めるのがオススメです。
競技プログラミングの練習を始めてみよう
競技プログラミングに対して「ハードルが高そう」と感じていた方もいるかと思いますが、最近では初心者向けのコンテストも多く開催されています。一人で黙々とプログラミングの勉強をしているだけでは、モチベーションが保てないこともあるでしょう。世界中の人と一緒に限られた時間の中で「いかに素早く的確なコードが書けるか」を追い求める競技プログラミングは、楽しく飽きずに挑戦できるため、スキルアップを目指す初心者にも適しています。初めての方も、まずはここまでご紹介してきた練習問題への挑戦から始めてみてください。
なお「プログラミングの基礎的な学習から始めたい」という方には、paizaラーニングの入門講座がオススメです。
「paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。
詳しくはこちら