こんにちは、ふるやん(@furuya1223)です。
先日、大学の研究室に新しい4年生が配属されたので、新メンバーに競プロを布教すべく、始め方の記事を書きます。
この記事は雑なので、あとで書き直して再投稿するかもしれません。
今週土曜日(4/6)の夜9:00〜夜10:40に初心者向けのコンテスト「AtCoder Beginner Contest 123」があります! 参加しましょう!
競技プログラミングとは
「こんな入力が来るからこんな出力をしてね」というような問題が出されるので、指示通りの出力を返すプログラムを作成する正確さと速さを競う競技です。
オンラインで行うので、自分のPCで書いたコードをWebページの提出フォームにコピペして提出します。自動で正誤判定が行われます。
問題は、例えばこんな感じです。
AtCoder Beginner Contest 111 – B「AtCoder Beginner Contest 111」
問題文
黒橋君は,AtCoder Beginner Contest (ABC) にまだ参加したことがありません.
次に行われる ABC は第 回です(100≦N≦999, Nは整数). 黒橋君は,初めて参加する ABC を第
x 回としたときに, の十進法表記でのすべての桁の数字が同じであるようにしたいです.
黒橋君が初めて参加する ABC としてふさわしいもののうち,最も早いものは第何回でしょうか?
入力
入力は以下の形式で標準入力から与えられる.
N
出力
黒橋君が初めて参加する ABC としてふさわしいもののうち,最も早いものは第何回かを出力せよ.
入力例 2
112
出力例 2
1 222
次に行われる ABC は第 回です.そのため,第 111 回の ABC にはもう参加することはできません. 黒橋君が初めて参加する ABC としてふさわしいもののうち,最も早いものは第 222 回です.
このような問題が、様々な難易度で4問ほど出題され、100分ほどでできる限り多く解きます。上記の問題はB問題なので、2番目に簡単なものです(A問題が最も簡単)。
AtCoderというコンテストサイトでは、ほぼ毎週土曜日の夜9時からコンテストが開催されている他、たくさんの過去問がいつでも解けます。正誤判定も常に自動でやってくれます。
競技プログラミングのメリット
- プログラミングが得意になる
- 過去問の上位者のコードを自由に見られるので、知らない記法などを知ることができる
- コーディングに慣れられる
- アルゴリズムや実装方法の知識が増える
- 就職活動に役に立つことがある
- 情報系の就活ではコーディングテストがあることが多い。これを楽に突破できるようになる
- 競プロ経験を評価する企業がある(IT系企業の一部)
- 「趣味」や「学生時代に取り組んだこと」で技術アピールができるようになる
- AtCoder Jobs というサービスではAtCoderのスキルを活用して就職活動やインターン応募などができます。
- 強い人に刺激される
- Twitterで強い競プロerをフォローするとなんかすごい人だらけなので諸々のモチベーションが上がる
- 闘争心を満たせる
- リアルタイムのコンテストに参加すれば、成績に応じてレーティング数値が付与されます。このレートが能力のアピールになったりします。
- レートに応じて色がつくので、この色が目標になります。
- でも競プロerは優しいのでレートが低いからといって馬鹿にされたりはしません。安心して精進しましょう
デメリットは「失敗したら悲しい」ぐらいなので、ぜひやりましょう。
競技プログラミングの始め方
本題です。AtCoderという日本のコンテストサイトが開催するコンテストに参加する手順を説明します。
AtCoderに登録
AtCoderのトップページ(https://atcoder.jp)にアクセスし、ページ右上の「新規登録」をクリックします。
必要な情報を記入し、登録します。
「ユーザ名」は一度登録すると基本的には変えられないので、ちゃんと考えて決めましょうね。(一度だけ変更可能なので、私はTwitterアカウントに合わせるように変更しました)
登録ボタンが「更新」になってますが、たぶんそれを押したら登録できます。
プログラミングの環境を用意する
AtCoderは様々な言語に対応していますが、オススメの言語は「C++」です。
C言語しかできない人は、C言語でも大丈夫です。C言語のプログラムをコンパイル・実行できる環境があればC++も実行できると思うので、興味があれば調べてみてください。
Pythonが使えるという人は、とりあえずはPythonでも大丈夫だと思います。難しい問題になると、Pythonの実行時間の遅さがネックになることがありますが、初心者向けの問題であれば大丈夫でしょう。(うまくやればPythonでも十分戦えます)
環境構築については様々な情報がネットにあるので、省略します。(余裕があれば別の記事に書きます)
初心者向け過去問を解いてみる
AtCoderには、初心者向け問題を集めた「AtCoder Beginners Selection」というものがあります。
これに挑戦してみましょう。
ページ上部の「問題」タブをクリックすると、問題のタイトルがいっぱい出てきます。
上から順番に解いていきましょう。
手元の環境でプログラムを作成して実行し、入力例の値を入力として出力が一致することを確認したら、問題ページ下にある「ソースコード」と書かれたテキストエリアにコードをコピペして提出します。
このとき、「言語」の欄で使用したプログラミング言語を選択してから提出しましょう。でないとエラーになります。
提出したら、なんか「WJ」みたいな表示がでますが、これは「Waiting Judge(判定待ち)」の意味です。
出力が全て正しければ、緑色の「AC(Accepted)」が表示されます。これが正解です。
間違いがあれば、黄色い「WA(Wrong Answer)」が表示されます。これは不正解です。不正解には他にREやTLEなどがあります。各ステータスの意味はこちらでご確認ください。
コーディングのコツを書いた記事を別で用意している(現在作成中)ので、そちらを見ながら解くのもいいと思います。過去問は山のようにあるので、10問程度で答えを先に見てしまってもどうってことないです。
Beginners Selection の解説記事はこちらです→競プロ脱超初心者のコツ(Beginners Selection解説)
Beginners Selectionと言いながら後半は結構難しいので、いきなりノーヒントで解けなくても大丈夫です。解けたらとてもすごいです。
さらに過去問を解きたい方は
AtCoder Scores という有志によるサイトが、問題を難易度順に並べてくれていて過去問練習に便利です。
Beginner Contest は主に100〜400点の難易度の問題が出ます。自分のスキルに合わせて問題を解いてみましょう。
AtCoder Problems という有志によるサイトでは、問題がコンテストごとに並んでいます。トップに「AtCoder Grand Contest」というコンテストがありますが、これは上級者向けという感じなので、その下の「AtCoder Beginner Contest」の問題を解きましょう。
リアルタイムでコンテストに参加
たくさん過去問を解けば自分の実力は上がりますが、レーティングは変化しません。
せっかくなのでレーティングを獲得するために、リアルタイムのコンテストに参加しましょう。
今週土曜日(4/6)の夜9:00〜夜10:40に初心者向けのコンテスト「AtCoder Beginner Contest 123」があります。
参加するには、まず事前にコンテストページから「参加登録」ボタンを押して参加登録をします。
参加登録をした状態で開始時刻の少し前にコンテストのページを開いておくと、開始時刻に問題が公開されます。
それからは、過去問と同じ要領で問題を解いていきます。最初から解いていくことをおすすめします。
AtCoderの特徴として、コンテストに参加登録をしていても、1度も提出しなければ不参加扱い(レート変化無し)になります。ただし、1回でも提出したら、それが不正解であっても参加扱いになります。提出したなら、最後までがんばりましょう。
ちなみに、AtCoderでは20回ほどリアルタイム参加しないとレートが適正値になりません。最初は実力よりも低いレートになっています。なので、レートを高くするにはとにかくたくさん参加する必要があります。
リアルタイム参加の様子はこちらの動画で確認できます。
解説を見よう
リアルタイムでコンテストに参加したあとは、解けなかった問題の解説を見ましょう。
コンテストが終了して数分すると、コンテストページ上部に「解説」タブが用意されます。ここから解説PDFを見ることができます。また、TwitterのAtCoderアカウント(@atcoder)ではYouTubeでの解説生放送のリンクが公開されます。眠くなければ解説生放送も見ましょう。非常に有益です。
過去問でも解説PDFや解説生放送は見られるので、解けない場合は見てみましょう。勉強になります。
だいたいこんな感じ
です。
基本的に「過去問解く→コンテスト参加→復習→過去問解く→」という流れの繰り返しです。
解けない過去問は解説を読んだりググって解説ブログを読んだりしましょう。
おわりに
何か質問があれば、Twitter(@furuya1223)などで遠慮なく聞いてください。
それでは皆さんよい競プロライフを。