C/C++で競プロ(PythonもOK)

競技プログラミングに関するページです。主にC++を使います。C言語・C++言語に興味のある人も見てください。

 

競技プログラミングとは

プログラミング能力は技能です。外国語の勉強と同じで、プログラミング言語を学んでもトレーニングをしなければ身に付きません。プログラミングコンテスト(競技プログラミング、略して競プロ)に参加することでプログラミング能力を身に付けることができます。

「競技プログラミングの鉄則」の著者(国際情報オリンピックで3回金メダルを獲得した高校生。2020年現在は東大に在学中。)のプレゼンがわかりやすいので紹介しておきます。こちら です。

 

何が得られるか?

競プロはプログラミング能力を競うものですが、物事を論理的に考えるための良い訓練になります。IT分野の技術者を目指す学生は基礎体力を養うことができます。

認知度が高いコンテスト団体で一定のレベルに到達していれば、IT企業への就職にも有利です。サイトによっては就職情報サイトを兼ねている場合もあります。例えば AtCoder の AtCoder Jobs というコンテンツには求人情報が掲載されています。

 

何が必要か?

何かひとつのプログラミング言語の知識と、自分でコーディングしたプログラムを実行する環境(パソコンとその上の開発環境)があればすぐに始めることができます。後で説明するようにプログラミング言語の選択肢はたくさんありますが、このページではC++言語を使うことを想定して説明を進めます。

 

プログラミング言語の選択

競プロでは色々なプログラミング言語が使えます。例えば AtCoderのこのページ には使えるプログラム言語の一覧表があります。どの言語を使うべきか悩むところですが、既に何かのプログラミング言語を勉強したことがあれば、まずはそれで始めてみましょう。自分の興味のある言語、得意な言語で問題ありません。

AtCoder の参加者は、C++ が6割、Python が3割、残りはその他という状況です。C++ が多いのは競プロの解説本が C++ で書かれることが多いのと、コンパイルして実行する言語の方がプログラムの実行速度が早く、ランクが上がってくると実行時間制限をクリアするのに有利だからです。Python は実行速度の面では不利ですが、そもそも Python を学ぶことを目的に競プロに参加するという人なら、Python を選択しても何ら問題ありません。他の言語も同じで、例えばゲーム制作に興味を持っている人なら C# も選択肢になるでしょう。

Mac の場合、C++ の処理系は GCC(コマンドはg++)と Clang がありますが、競プロには GCC が使われることが多く、解説記事もその前提で書かれていることが多いです。以降では GCC の g++ コマンドを使う方法を主に説明します。

 

開発環境

競プロでは作成したプログラムをWEBサイト経由で提出しますが、そのプログラムを実行して動作確認するための環境が自分のパソコン上に必要です。既に使い慣れた開発環境を持っている場合は、その処理系(コンパイラの種類)がAtCoderで対応しているものであればそのまま使えます。次の記事では GCC をインストールする方法を何通りかと、その後で VSCode を使って開発環境を作る方法を説明します。

競プロ用のプログラミング環境(C++言語)
プログラミングコンテスト(競技プログラミング、略して競プロ)に参加するには、自身のパソコン上に、使用するプログラム言語の開発環境が必要です。この記事ではC++言語を使用する前提でパソコンの設定手順について説明します。C++言語の処理系は複数...

 

プログラミングの勉強

競プロに取り組む前に、やはりプログラミングの基本は身につけておく必要があります。ここではC/C++言語の学習方法について触れます。

知識として文法を知っているだけでは不十分です。簡単なプログラムであればスラスラと書き下せるように練習してください。初学者は次のページを参考にしてください。

C言語・C++言語の学び方
C言語・C++言語がまったく初めての人、あるいは、ひと通り文法を勉強したが自分でプログラムを書こうとすると頭が真っ白になってしまう人。そのように人に読んでもらいたい記事です。本は必要か?新しくプログラミング言語を学習するとき、教科書として使...

 

文法を少し覚えたけれど自分でコーディングするには経験が足りないという場合、GitHub Copilot を使うと良いかもしれません。簡単な問題なら自動で解いてくれます。ただし、AtCoder ではコンテスト中の生成AI機能の利用を制限しています。詳しくは AtCoder の規約を確認してください。

GitHub Copilot
GitHub Copilot とはGitHub Copilot を使うと、プログラム内のコメントや書きかけのソースコードに反応して、必要と思われるソースコードを自動的に提案してくれます。ChatGPT で有名な OpenAI 社の技術が使わ...

 

100本ノック

京都産業大学さんのサイトを紹介します。C言語の練習問題ですが、C++言語でも基礎編・初級編くらいの内容は参考書を見なくてもコーディングできるようになってください。

基礎プロI 100本ノック

 

アルゴ式

プログラミング言語の文法はマスターしたけれど、本格的に競プロを始めるには練習不足でまだ自信がない、という人にはこのサイトを推薦します。「試してみる」をクリックすると問題の一覧が表示されます。文法の復習をするための練習問題から、初心者向けのコンテストでも出題されるレベルまでカバーされています。アカウント登録すると、これらの問題はブラウザ上で回答を提出して動作させることが出来ます。

アルゴ式

 

AtCoder

いろいろな団体がプログラミングコンテストを実施していますが、特に拘りがなければ AtCoder を推薦します。

 

アカウント登録

下のページにアクセスして「新規登録」のリンクからアカウントを作成してください。

AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

こちらも例題が引用されることが多いので、登録しておくと便利です。

AIZU ONLINE JUDGE: Programming Challenge

 

ABS (AtCoder Beginners Selection)

AtCoder に登録したばかりの時は何から始めればよいかわからないと思います。まずここから始めてください。

AtCoder Beginners Selection - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
  • このページを使うには AtCoder にログインが必要です。ログインしていないと、問題を見ることは出来ますが解答することはできません。
  • 画面上部のタブ「問題」の中に例題が11問あります。最初の問題「PracticeA – Welcome to AtCoder」は解答を提出する手順の説明を兼ねていますので、表示されている解答例をそのままコピペして「ソースコード」の欄に貼り付け、言語の種類を選択して「提出」ボタンを押してみてください。
  • C++言語の場合、「言語」には「C++ (GCC 9.2.1)」と「C++ (Clang 10.0.0)」の選択肢がありますが、競プロで一般的に使われるのは「C++ (GCC 9.2.1)」です。Macで最初からインストールされているg++コマンド(その実体はClang)を使っている人は「C++ (Clang 10.0.0)」を選択します。
  • 2問目以降のページには解答例は表示されませんので、自分でプログラムをコーディングして解答を提出します。この10問を解けるレベルになれば本番のコンテストに参加しても十分に通用します。「参加しても毎回0点だ」ということは無くなるはずです。
  • 提出する具体的な方法とC++言語での解答例と解説は dr.kenさんのページ にあります。AtCoder 初心者向けのガイドになっているので参考にしてください。Pythonの解答例は こちらのサイト にあります。
  • ABSのトップページには AtCoder Programming Guide for Beginners がリンクされています。C++言語の復習に使ってください。問題の難易度が上がってくると、C++言語で用意されているデータ型やテクニックの知識なしでは解けなくなります。しっかり理解するようにしてください。
  • AtCoderのサイトを使っているといろいろな略語が出てきます。例えば正答した場合には AC と表示されます。このような略語をまとめたのが 用語集 のページです。

 

コンテストに参加する

ここまでくれば実際にコンテストへの参加が可能になります。AtCoder のページ上部に「コンテスト」のタブがあるので開いてください。コンテストに参加するための情報が掲載されています。さらに2段めのタブから「コンテスト一覧」を開くと、開催済み・未開催などに分類されてコンテストが表示されます。

AtCoder のコンテストにはいくつかのカテゴリーがあり、初心者向けのものは AtCoder Beginner Contest (ABC) と呼ばれ、毎週土曜日に開催されています。初めて参加するときはこの ABC がターゲットになります。時間は100分です。毎回変わりますが、問題数は8問、配点は 100-200-300-400-500-500-600-600 のことが多いです。最初のうちはA問題(配点100点)を解くのが精一杯かもしれませんが、だんだんと難しい問題も解けるように勉強を続けてください。

いきなり本番のコンテストに参加するのは気後れする、という人は過去問をといてください。コンテスト一覧から「過去のコンテスト」のタブを選びます。過去のコンテストの問題は見たり、回答を提出することもできます。コンテストごとのトップページには「バーチャル参加」というボタンがあり、コンテスト本番と同じように時間制限内での解答にチャレンジすることも出来ます。

 

競プロの攻略法

競プロのランクを上げるのは実行あるのみ。どんどんコンテストに参加しましょう。でも行き詰まることもあると思います。

AtCoderのレーティング

AtCoder でコンテストに参加すると、結果に応じて各参加者にレーティングが付与されます。レーティングは色で表され、灰・茶・緑・水・青・黄・橙・赤 という順番に進みます。初めてコンテストに参加したときは、よほどの高得点でない限り全員が「灰色コーダー」です。「赤色コーダー(レッドコーダー)」は世界大会レベルでも活躍するくらいの実力で、日本全体でも数10人しかいません。

どの色がどのような実力かという「レベル感」はブログ記事などがたくさんありますので検索してみてください。参加者全体の半数以上が灰色コーダーなので、学生であれば茶色でも十分優秀です。競プロの実力を図る基準としてレーティングの色を意識すると良いです。ちなみに、AtCoder Jobs の求人情報を見るとわかりますが、企業はレーティングの色を基準に求人するようです。

目安としては、ABCコンテストでA・B・Cの3問がコンスタントに正答できれば茶色、D問題まで正答できれば緑色くらいです。ただし、コンテストの参加回数が少ないうち(概ね10回以内)は低めのレーティングが付くそうなので気にする必要はありません。

 

テンプレートを作る

コンテストに参加したときに少しでも時間を節約できるようにテンプレートを作ってください。

競プロ用テンプレート
競技プログラミングは制限時間内に効率よくコーディングする必要があるので、必要なヘッダーや定義を予め書き込んだテンプレートを作っておきましょう。解答を作るときにまずテンプレートファイルをコピペして、そこから始めるようにします。決まった内容は無...

 

サンプルコードを蓄積する

初級者の場合は文法を忘れてしまったり、解答を書いては見たものの正しいかどうか自信がない、ということがあります。問題のレベルが高くなると、特定のデータ型や標準関数をうまく使わないと解けない問題も出てきます。そのようなときに文法を調べ直したり、データ型・関数の仕様をいちいち確認していたのでは効率が悪く、コンテストでは時間を無駄にしてしまいます。

そこで、問題を解いたらそのままにするのではなく必ず復習・検討して、再利用できるようなソースコードはテンプレートと同様にいつでも引用できるように管理してください。AtCoder Programming Guide for Beginners の解説はちょうどそのようなまとめ方になっているので参考にできると思います。

 

チートシート

再利用できるコードをまとめたものです。Python版もあります。

競プロ用チートシート(C++) 競プロ用チートシート(Python)

 

Tips

チートシートもそうですが、過去問を解いて得たノウハウを蓄積することはとても重要です。例えば、

C++ の除算・剰余算

 

ACL

ABC のC問題がある程度解けるようになったら、ACL も使えるようになってください。

AtCoder Library (ACL)
AtCoder Library (ACL) は AtCoder が公開しているC++用のライブラリです。ABC のC問題ぐらいまではC++の標準ライブラリでほとんど対応できますが、それ以上のレベルになると(C問題でも時々は)ACL を使用す...

 

アルゴリズムを学ぶ

競プロの問題には典型的な出題パターンがあり、そのような問題を解くためのアルゴリズムが存在します。緑色以上のレーティングを目指すにはアルゴリズムの勉強が不可欠です。典型問題を分類して解説した競プロ関係のプログを見かけることがあります。そのようなブログの幾つかは AtCoder の「常設中のコンテスト」で解答できるようになっています。

 

書籍・参考書

言語によらずアルゴリズムはプログラミングの基本です。解説書をいくつか紹介しておきます。

 

仲間を見つける

同じ勉強をしている仲間を見つけてください。解き方のアイデアを出し合ったり、お互いのプログラムを見せあって評価する(コードレビューと言います)ことはとても勉強になります。また、初心者を積極的に教えて下さい。人に教えることによって自分自身の考え方が整理できます。

 

コメント