ミリしらから始める競技プログラミング #AtCoder

競技プログラミングってなんか面白そう！　でも1ミリも知らない！
そんなあなたに競技プログラミングの概要、始め方、楽しみ方を一から解説する記事です。

※わかりやすさのために正確性を犠牲にしている個所がいくつかあるのでガチ勢はつっこまないでね！

##競技プログラミングってなに？
プログラミングで与えられた課題を解決する能力を競うコンテストです。
競技プログラミングを略して競プロ、またはプログラミングコンテストを略してプロコンといいます。
例えば以下のような問題が出題されます。

>正の整数Nが与えられます。
A≤B≤CかつABC≤Nであるような正の整数の組(A,B,C)の個数を求めてください。
*AtCoder Begginer Contest 227 C*
https://atcoder.jp/contests/abc227/tasks/abc227_c

このような問題をいかに速く解けるかによって順位がつき、それに合わせてレーティングが上下します。

##どこでやってるの？
いくつかサイトがありますが、日本語最大手であるAtCoderが一番やりやすいです。

https://atcoder.jp/

##何からしたらいいの？
まず新規登録しましょう。こちらのページの右上から新規登録ができます。

https://atcoder.jp/

**「いやあんまアカウント増やしたくないんだよね俺。とりあえずアカウントなしでできることないの？」**
わかります。

しかしAtCoderでアカウントを作らずに楽しめることはほぼありません。
メールアドレスだけで電話番号もクレジットカード番号もいりませんから、アカウント登録をお願いします。

##アカウント登録の次は？
アカウントの登録ありがとうございます！！
では早速簡単な問題からやってみましょう。
AtCoderでは過去問を全て公開しています。初心者向けのコンテストであるAtCoder Begginer Contestの231回に挑戦してみましょう。
まずは以下のリンクからコンテストページに行きましょう。

https://atcoder.jp/contests/abc231

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/77b63013-99f5-438c-2b35-63f801b617be.png)


左上に
**コンテスト時間: 2021-12-11(土) 21:00 ~ 2021-12-11(土) 22:40 (100分)**
と書いています。
このコンテストは上記時間に行われていました。コンテストはすでに終了していますので、これが解けても順位がついたりレーティングが上がったりすることはありません。

では次に「問題」に進みましょう。ページ上部に青色で「問題」と書いています。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/e421eb6f-5f59-cbfa-fbea-e56d22ad7a02.png)


A~H問題まであります。Aが一番簡単、Hが一番難しい問題です。
早速A問題に進みましょう。

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/8b83006a-90dd-aeda-7902-b97a3fd42b13.png)

この問題をプログラミングで解きます。

##どうやって解くの？
問題文の内容からしてD/100を出力するプログラムを書けばよさそうです。
よって以下の3手順です。
①D(入力)の受け取り
②D/100を計算
③計算した値を出力

しかし入力だの出力だの言われてもよくわかりませんね。順番にやっていきましょう。
プログラミング言語はpythonで説明します。
pythonインストールしてない！使ったことない！という人でも大丈夫ですからとりあえず先に進みましょう。

**①D(入力)の受け取り**
入力を受け取るときは以下のように書きます。

```python:D(入力)の受け取り
D=int(input())
```

これでDに入力された数が入ります。

**②D/100を計算**
計算結果はans(answerの意味)という変数へ格納しましょう。
割り算はそのまま「/」で行えます。

```python:D/100を計算
ans=D/100
```

**③計算した値を出力**
出力する時はprint(出力するもの)と書きます。
ansを出力したいので以下のようになります。

```python:計算した値を出力
print(ans)
```

①,②,③をまとめましょう。

```python:答え
D=int(input())
ans=D/100
print(ans)
```

これが答えのコードです。
合っているか確認します。
問題ページには入力例、出力例が書いていますから、書いたコードに入力例を入力してみて、出力結果が出力例と一致すればOKです。
pythonが自分のPCに入っている人は「答え」を実行し、入力例を入力してみましょう。

pythonが入っていない人は問題ページの上部にある「コードテスト」に行きましょう。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/bef07ec1-30cd-e69d-26e6-4d94a4a11fd9.png)

「コードテスト」では答えを提出する前にブラウザ上でプログラムの実行ができます。
「言語」は「python」(3.8.2とかは気にしなくていいです)
「ソースコード」は上記の「答え」
「標準入力」は入力例1の「1000」
を入力してください。
全部書けたら「実行」してみましょう。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/233f8985-66f2-439d-442d-2128dc520a24.png)
以下のように「標準出力」へ「出力例1」と同じ「10」が出力されていれば正解です。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/49e4193f-4cda-a9cb-f4f2-6ad0f7076ae3.png)

コードに間違いがある場合は以下のように「標準エラー出力」がされます。
コードのどこが間違っているか、「ソースコード」に書いているものと「答え」を見比べて確認しましょう。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/1e8ff933-be1d-6f25-38d7-b4fea07d02f3.png)

「入力例2」「入力例3」も同様に確認し、「出力例2」「出力例3」と一致すればOKです。

書いたコードを提出しましょう。
問題ページの一番下に「提出」場所があります。
「言語」は「python」(3.8.2とかは気にしなくていいです)
「ソースコード」は「答え」
を入力して「提出」を行います。

![7.5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/723484a7-0a9d-94c9-4e4b-55b50ee2b6fe.png)

しばらく待つと以下のように表示されたと思います。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/2da0013a-327f-9485-c599-86bb239d63ea.png)
緑の「AC」は「Accepted」つまり「正解」です！おめでとうございます！！！！

「WA」とか「RE」とか出た人がいればそれはコードのどこかに間違いがあります・・・。
もう一度ソースコードを見直しましょう。

##は？簡単すぎん？
簡単ですね。じゃあこのコンテストで一番難しい問題であるH問題を見てみましょう。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/03072fe1-b72c-c48e-e5e3-0d083af2f994.png)

OK。さっぱりわかりませんね。
大丈夫です。このコンテスト中にH問題が解けた人は参加者約6000人のうち**70人**しかいません。

競技プログラミングは非常に奥が深いです。あなたを飽きさせることはないでしょう。

##レーティングって何？
せっかく競技プログラミングを始めたので実力がどれくらいか知りたいものです。
AtCoderではコンテストの成績によってレーティングが振られます。
AtCoderのページ右上に自分のユーザー名が書いていると思います。そこをクリックして「マイプロフィール」に進んでみましょう。

![9.5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/5ee5c4a2-5f32-c022-1ac6-e40064855936.png)

始めたばかりのみなさんの画面はほぼなにも書いていないと思いますが、コンテストに出場し始めると以下のような画面が表示されます。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/58d8624b-67f6-8a4f-e5da-1d3a8a1089a1.png)
私の画面は以下で見れます。
https://atcoder.jp/users/sano192

この「928」というのが現在のレーティングを表しています。
色が緑になっていますね。これが競技プログラミングの実力を表す色です。緑は下から3番目です。
灰→茶→緑→水→青→黄→橙→赤
というように進んでいき、最上位である赤になった人は「レッドコーダー」と呼ばれ、崇め奉られます。
みんなこの色を上に上げられるように、コンテストを頑張るわけです。
ちなみに各色がどれくらいのプログラミングレベルなのかはAtCoder社長の高橋さんがブログに書いています。

https://chokudai.hatenablog.com/entry/2019/02/11/155904

##コンテストはどうやって出場するの？
出場方法の前に種類を説明します。
2022年1月時点でコンテストは4種類あります。
・ABC(AtCoder Begginer Contest)
　一番簡単。あなたがまず出るべきコンテストはこれ。
・ARC(AtCoder Regular Contest)
　難しい。意欲があるなら出てもよいが1問も解けなくて面白くないとなる可能性が高い。
・AGC(AtCoder Grand Contest)
　激ムズ。初心者はレーティングもつかないので出る意味はない。
・AHC(AtCoder Heuristic Contest)
　通常のコンテストと違うヒューリスティック部門のコンテスト。こちらも難しいのでおすすめしない。

コンテストはABCがだいたい毎土日夜に開催されています。
AtCoderトップページ左上の「コンテスト」から開催予定のコンテストを見てみましょう。

https://atcoder.jp/home

![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/ad2c6ddd-69e6-a7e9-dcdf-b2c5d44744bf.png)

左側に「予定されたコンテスト」というのがありますね？
ここが今後開催予定のコンテストです。
開催予定のAtCoder Begginer Contestを開いてみましょう。

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/5a17b5e8-da3e-ff52-c0d2-4b801b317be9.png)

「参加登録」というところを押すと参加登録がなされます。

![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/bb78106c-ce18-17e9-671a-11e866048e92.png)

更にそのあと「Rated参加登録」か「Unrated参加登録」か選択できます。
Ratedにしないと出場してもレーティングがつきません。
初回は様子見でUnrated・・・というのもありですが、レーティングがつかないと楽しくないのでRatedをおすすめします。

開催時間になるとコンテストページの表示が変わり、問題が解けるようになります。
制限時間内に一問でも多く解けるように頑張りましょう！！

なお、参加登録はいつでも取り消し可能です。予定が入るかもという場合もとりあえず参加登録しておけばよいでしょう、

##過去問はどこからやればいい？
AtCoderのトップページからも過去のコンテストページを開くことは出来ますが非常に見づらいです。
有志が作った過去コンテストまとめページ「AtCoder Problems」を使いましょう。

https://kenkoooo.com/atcoder#/table/

![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/3620351c-9fd1-26f5-0f03-1f5e2e83931f.png)

各問題ごとについている色は難易度だと思ってください。最初はとにかく灰色の問題をたくさん解くとよいです。

左上の「UserID」に自分のユーザー名を入れることで、自分が正解した問題に色が付きます。
例えば私の名前「sano192」と入れてENTERを押すと以下のようになります。

![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/948fa80b-2989-63d7-c513-a74d3a824f1b.png)

背景緑が「AC」した問題です。

次のコンテストまでに背景緑を増やせるように頑張りましょう。
おすすめは新しい順からA,B問題をひたすらやる方法です。

##過去問やってみたけど解説がまったくわからん。
過去問を解いていってC問題あたりまでくると公式解説が難解になることが多いです。
公式の解説は各コンテストページのほか、ABCではYouTubeで動画の解説も行われています。
例えばさきほど解いたABC231の動画解説は以下です。

https://www.youtube.com/watch?v=nXyz3oUEidc

これでもわからないという場合は「ABC231 解説」等でググりましょう。個人がYouTubeや個人ブログ、Qiitaなどで解説を書いています。

私がABCについて解説を書いているものもあるのでぜひ参考にしてください。

https://qiita.com/sano192/items/54accd04df62242b70f0

##【広告】
**「AtCoder　凡人が『緑』になるための精選50問詳細解説」**

AtCoderで緑になるための典型50問を**ひくほど丁寧に**解説した本(kindle)、pdf(booth)を販売しています。
値段：**100円(Kindle Unlimited対象)**
**【kindle】**

https://www.amazon.co.jp/gp/product/B09C3TPQYV/

**【booth(pdf)】**

https://sano192.booth.pm/items/3179185

**1～24問目まではサンプルとして無料公開しています**

https://qiita.com/sano192/items/eb2c9cbee6ec4dc79aaf