近年、プログラミングを勉強している人たちの中では「競技プログラミング」の人気が高まり、競技人口も増加しています。
競技プログラミング(競プロ)とは出題されたプログラミング問題を制限時間内に解いて競い合う競技のことで、プログラミングコンテスト(プロコン)と呼ばれることもあります。
競技プログラミングは初心者でもゲーム感覚で楽しく挑戦できて勉強にもなるため、経験者だけでなくプログラミングを勉強中の方にもオススメです。「競プロはベテランの経験者向け」というイメージを持っている人もいるかと思いますが、初心者向けの練習問題を公開しているサイトなどもあります。
この記事では、競技プログラミングの始め方や練習に使える問題集をご紹介します。
【目次】
競技プログラミングとは
競技プログラミングとは、主催から出題された問題を制限時間以内に参加者が解いて競い合う競技です。ルールや前提条件などは、大会やサイトなどによって異なります。基本的には問題の正解数やコードの作成時間などを競い合い、制限時間は2時間程度で終わるものもあれば、1日がかりとなる場合もあります。またとにかくコードの短さを競う、コードゴルフというものもあります。
問題内容も条件分岐や繰り返しなどが理解できていれば解ける初心者向けのものから、Web開発やデータ分析、機械学習などといった専門知識が必要となるものまでさまざまです。
そのため自分にあったレベルの問題を選べば、初心者でも気軽に挑戦できてプログラミングの勉強に役立てられるでしょう。
競技プログラミングの始め方
競技プログラミングのサイト
競技プログラミングのサイトは世界中にありますが、日本でプログラミングを勉強している人にはAtCoderがオススメです。初心者の場合、まずは毎週土曜日に開催されている「AtCoder Beginner Contest」から挑戦してみるのがよいでしょう。
AtCoderはプログラミングコンテストを開催している日本の有名サイトです。競技プログラミングをしている人ならほとんど参加経験があるため、聞いたことがある人も多いでしょう。
「有名なサイトだから経験者向けの問題ばかりで難しいのでは」と思うかもしれませんが、比較的簡単な問題が出題されることもあり、「はじめての方へ」というチュートリアルのページもあります。そのため「競プロに興味はあるけど、プログラミングスキルに自信はない」「初心者だから競技プログラミングなんてまだ難しそう」という方にもオススメです。
競技プログラミングで使う言語
すでに使い慣れた好きな言語があればそれを使うのが一番ですが、これからプログラミングの勉強を始める初心者の方にはPythonがオススメです。
Pythonはプログラミング言語の中でも比較的構文が短く、初心者でも直感的にわかりやすく書きやすい言語です。競技プログラミングでは素早くコードを書いて問題を解くことが求められるため、コードが書きやすい上に短くて済むPythonは初心者にも適していると言えるでしょう。
またPythonは、競技プログラミングで使えるライブラリが充実しています。ライブラリとは簡単に言うと処理を実装する際に手助けをしてくれるツールで、活用すれば必要なコードを短く素早く書くことができます。
ただしPythonは実行速度が速い言語ではないため、大きな大会で上位を争うような人の多くはC++を選ぶ傾向です。
競技プログラミングがはじめての方にオススメの問題集
事前にプログラミング問題を解く練習をしておけば、競技プログラミングの問題にも落ち着いて対応できるでしょう。とくに初心者にオススメのプログラミング問題集をご紹介しますので、ぜひ挑戦してみてください。Dランクレベルアップメニュー
paizaでは、プログラミング問題を解くことで自分のスキルのレベルがわかる「スキルチェック問題」を公開しています。スキルチェック問題はS・A・B・C・Dのランクにわかれており、解いた結果によってS・A・B・C・D・Eという6段階のランクを取得できます。
Dランクレベルアップメニューはもっとも初心者向けのDランク取得を目指すための問題集で、プログラミングの基礎的な文法を総合的に学べます。プログラミング問題に挑戦してみたい初心者の方は、まずはこの問題集から取り組んでみるのがよいでしょう。
条件分岐メニュー
条件分岐とは、たとえば「入力された郵便番号が存在する場合は該当の住所を表示し、存在しない場合はエラーメッセージを表示する」など、条件を指定して実行する処理を分岐させたいときに使う制御構造です。条件分岐はどの言語を使う場合も共通する、プログラミングの基礎的な概念です。
条件分岐メニューではif文や論理式といった条件分岐の扱い方、問題の解き方が学べるため、条件分岐が苦手な初心者の方、さらに理解を深めたい方にオススメです。
ループメニュー
ループとは、たとえば「1から10までの数字を順番に出力する」など、指定の条件を満たすまで繰り返し処理を実行させたいときに使う制御構造です。同じ処理を何度も手作業で書くのは効率が悪いですが、ループを使えば一度コードを書くだけで条件を満たすまで繰り返し実行させることができます。ループも条件分岐と同じく、プログラミングの基礎的な概念です。
ループメニューではfor文やwhile文などどいったループの処理を学び、簡単なループ処理を自分で実装できるようになります。ループが苦手な初心者の方、さらに理解を深めたい方にオススメです。
配列メニュー
配列とは、簡単に言うと複数のデータを順番に並べたデータ構造です。たとえば「社員10人分の売上金額の合計や平均を算出したい・最高額と最低額を調べたい」といった場合、人数分の変数を用意しなくても配列を一つ使うだけで効率よく計算ができます。配列はループ処理と組み合わせて使う場面が多いため、並行して学んでおくとよいでしょう。
配列メニューでは1次元配列の入出力・2次元配列の入出力・配列の検索などが学べます。配列に挑戦したい方、配列が苦手で基礎から学びたい方にオススメです。
競技プログラミングの練習にオススメの問題集
競技プログラミングで出題されるような問題を解くには、アルゴリズムの知識が必要不可欠です。paizaラーニングの「レベルアップ問題集」では、各アルゴリズムを使った問題を公開してます。「競技プログラミングの練習がしたい」「苦手なアルゴリズムがあるので対策したい」という方はぜひ挑戦してみてください。定番アルゴリズムの習得
まずは探索やソートといった基礎的なアルゴリズムを習得しましょう。
探索は複数のデータの中から特定の条件に一致した値を探すとき、ソートはデータを昇順または降順に並び替えるときに使うアルゴリズムです。
線形探索・二部探索・挿入ソート・選択ソートといった初歩的なアルゴリズムから始めて、徐々に幅優先探索・深さ優先探索・マージソート・クイックソートなどといった効率的なアルゴリズムを学んでいきましょう。
定番グラフアルゴリズムの習得
グラフとは、簡単に言うといくつかの頂点とそのうち2つの頂点を結ぶ辺の集合のことです。このグラフを使った問題も多く出題されます。
とくにグラフを使って最短経路を探す問題がよく出題されますが、最短経路を探すためのアルゴリズムにはさまざまな種類があり、難易度が高いものも少なくありません。
初心者の場合まずはグラフの構造を理解し、入出力や隣接行列や隣接リストの実装ができるようになりましょう。
テキストや文字列処理の習得
文字列処理に関する問題もよく出題される傾向にあります。
初心者の場合、まずは正規表現についての理解を深めましょう。そのあとは与えられた文字列に対するトライ木の構築や、トライ木を使った文字列の検索などができるようになるとよいでしょう。
また文字列処理では探索やソートのアルゴリズムの理解も必要となるため、並行して学習を進めるのがオススメです。
競技プログラミングに挑戦してみよう
競技プログラミングには、限られた時間の中でいかに効率のよいコードを素早く書くかを追求しながら、リアルタイムで日本中・世界中の人々と対戦できる楽しさがあります。初心者の方も臆せずぜひ挑戦してみてください。なお「プログラミングの基礎的な学習から始めたい」という初心者の方には、paizaラーニングの入門講座がオススメです。
「paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。
詳しくはこちら