AtCoderをpythonで始める

# なんの記事？？
### 読むべき人
- プログラミングやったことない or やったことあるけど、いまいち何していいかわからない人
- pythonを勉強したい人
- 競技プログラミングやったことがない人


:::note warn
すでにある程度できる人からしたら当たり前の内容になっているかもです
:::

### 書いていること
- 競技プログラミングとは？
    - atcoderの使い方
    - 便利なサイト紹介
- pythonの実行環境について
    - リモート環境: google colabの使い方
    - ローカル環境: pyenvの使い方



# 競技プログラミングとは？
競技プログラミングは、限られた時間内にアルゴリズムやデータ構造を駆使して与えられた問題を解決することを競うプログラミングコンテストです。代表的なプラットフォームとして、AtCoder、Codeforces、LeetCodeなどがあります。これらのサイトでは、実際に問題を解きながら自分のスキルを磨くことができます。

#### AtCoderの使い方
AtCoderは日本国内で非常に人気のある競技プログラミングプラットフォームです。
まずは、[このリンク](https://atcoder.jp/login)にアクセスしてアカウントを作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/9d690007-cfe3-c7b3-9d52-42a16bede05d.png)

アカウントが作成できたら、早速[コンテスト](https://atcoder.jp/contests/)を見てみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/7b979781-cc22-2680-ae05-4bbffdb3618d.png)

コンテストには、常設中と予定されたコンテストと終了後のコンテストに分かれて色々なコンテストがあると思います。

何していいかわからないと思うので、まずは[AtCoder Beginners Selection](https://atcoder.jp/contests/abs)にチャレンジしてみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/7fdd21ac-45ab-a0b6-2880-6423c397a90d.png)

問題タブに行くと問題が11問あると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/1519a86a-8da0-7509-edf5-3d25b834bc8e.png)

基本的に上が一番簡単で、下が一番難しいようになっています
一番上の問題([PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1))を開くと問題が見えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/6009caab-3570-bad8-121d-f0880ea504aa.png)

### 問題の構成
1. 問題文
1. 制約
1. 入力
1. 出力
1. 入力例
1. 出力例
1. 回答欄

この構成は基本的に全て一緒です。
まず初めは、「問題文、入力例、出力例」を見るといいかもしれません。

#### 便利なサイト紹介
- [AtCoder Problems](https://kenkoooo.com/atcoder/#/table/): AtCoderの問題をカテゴリ別に整理してくれるサイトです。
- [問題検索](https://andoryoto.github.io/WebApplication/searchapp/index.html): atcoderの問題を検索できます。

# Pythonの実行環境について
ここからは、先ほどのatcoderのコンテストでpythonの回答を作成するためにpythonの実行環境を作成しようと思います。
Pythonで競技プログラミングを行うためには、適切な実行環境を準備することが重要です。ここでは、Google Colabを使ったリモート環境と、pyenvを使ったローカル環境の2パターンを紹介します。
- リモート環境(お試しだけなら)
    - ブラウザ上でpythonを実行できる環境
    - 構築が簡単
- **ローカル環境**(圧倒的おすすめ)
    - 自分のパソコンでpythonを実行できる環境
    - 構築がめんどくさい
    - 自分好みにカスタマイズしやすい

#### リモート環境: Google Colabの使い方
Google Colabは、ブラウザ上でPythonコードを実行できるサービスで、特に環境構築が面倒な方におすすめです。以下の手順で利用できます。

1. [Google Colab](https://colab.research.google.com/)にアクセスし、Googleアカウントでログインします。
2. 「新しいノートブック」を作成し、Pythonコードを記述していきます。
3. 実行ボタンを押すだけで、コードが即座に実行され、結果が表示されます。

#### ローカル環境: pyenvの使い方
ローカル環境でPythonを利用したい場合は、`pyenv`を使って複数のPythonバージョンを管理すると便利です。

先ほどのcolabよりは面倒なことが多いですが、わかりやすい記事をいろんな方が書いてくださっているので参考にしてみましょう

- [widowsの方はこちら](https://qiita.com/probabilityhill/items/9a22f395a1e93206c846)
- [macの方はこちら](https://ralacode.com/blog/post/build-python-environment-with-pyenv/)

pythonのコードを書くために[vscode](https://code.visualstudio.com/)もインストールしておきましょう

# プラス一歩！
ここまでで、atcoderについて、pythonの環境について、理解が深まったでしょうか？
ここからは、実際に競プロのコンテストの問題を解いていく上で便利な内容をまとめてみようと思います。

### 入力、出力とは？
競プロを解いていく上でまず知っておかないといけない最初の最初が入力と出力についてです。

入力とは、atcoder側から与えられる情報のことです
先ほど紹介した、[PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)この問題では、
```zsh: 入力
a
b c
s
```
という入力が与えられていますね

個人的に、入力において重要なことは、3つです
- データの型
- データの個数
- データの与えられ方(1行でデータが並んでるか3行に分かれてデータが並んでいるかなど)

上の入力の場合だと、`a, b, c, d`という4つのデータが、3行に分かれて与えられていて、データの型は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/b6b6f4a2-bd82-c225-f58f-ce079eac85d2.png)

- `a, b, c`: 整数
- `s`: 文字列

となっていますね
この入力を受け取る方法は、
```python
a = int(input())
b, c = map(int, input().split())
s = input()
```
このように書くのが一般的かなと思います
コードが少し難しいですね、、、
でもここで便利な素晴らしい記事があって、[こちら](https://qiita.com/ell/items/1f519aff0cdc3cf16284)を参考にコピペしてみるとよきだと思います

https://qiita.com/ell/items/1f519aff0cdc3cf16284

初心者脱出したい方はぜひコードの意味も調べてみてください

### 毎回書くのめんどくせええ！
atcoderをやっているとよく書くコードがあります
例えば、入力は、基本的には、整数と文字列しかないので、パターン数としては限られてるし、
```python
n = int(input())
```
これなんかは全ての問題で出ると言っても過言ではない(過言)くらいよく出てきます
こういうコードをパパッと書きたいときに便利なのが、スニペットです


ここではvscodeを使っている人向けの便利なスニペットとその使い方を紹介したいと思います
まずは、普段atcoderを解いているフォルダを見てみましょう

```
/atcoder
├ .vscode
│ └ python.code-snippets
└ ABC
  ├ 001.py
  ├ 002.py
  └ ...
```
開いたらそのフォルダに`.vscode`という名前のフォルダを作成し、その中に`python.code-snippets`というファイルを作成しましょう
```js:python.code-snippets
{
  "ii": {
    "prefix": "ii",
    "body": ["int(input())"],
    "description": ""
  }
}
```
これで、同じフォルダ(ここでは`atcoder`になってます)にあるpythonのファイル内ではスニペットが使用できるようになっているはずです

`ii`と入力すると候補が出てきて、`int(input())`を一瞬で入力できると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/35e476ef-0069-5f40-007e-16fc2813a515.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/330ab3d0-19c7-a002-9886-1345bd4b1d11.png)

このように色々なスニペットを登録していくとコーディングが少し早くなると思います
追加の方法は、まず、[こちら](https://migi.me/vsc_snippet/)のコード生成ツールを使わせてもらいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/6ef97e76-e828-f2a8-dd8d-78ea87571ffb.png)
スニペットを登録して作成ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/526c28f9-0784-ce40-3db1-20eaa792c445.png)

コピーして追加します
```js:python.code-snippets
{
  "ii": {
    "prefix": "ii",
    "body": ["int(input())"],
    "description": ""
  },
  // 追加
  "mi": {
    "prefix": "mi",
    "body": [
        "map(int, input().split())",
    ],
    "description": ""
  }
  // ここまで
}
```
こんな感じでどんどん追加していくことができます
(ちなみに私のスニペットは[こんな感じ](https://github.com/naoya25/atcoder/blob/main/.vscode/python.code-snippets)です)

### ここから先へ。。。
ここまでで、pythonでatcoderを解いていく準備が完了したと思います！
じゃあ次に何していこうという方に私が実際にやっていった手順を参考程度に紹介します

1. [AtCoder Beginners Selection](https://atcoder.jp/contests/abs)
    まずはABS(AtCoder Beginners Selection)をすべて解きましょう
    初心者からしたらかなり難しいものもあると思いますが、解説記事、動画などいっぱいあるので頑張って解いてみましょう
1. AtCoder Beginner Contest
    ABC(AtCoder Beginner Contest)に参加してみましょう
    現在(2024/8/1)では毎週土曜日の21時からやっているコンテストで、初級者向けのコンテストになっています
    初級者向けと言っても個人的にはかなり難しいです（現在緑コーダーです）
    まずは参加してみることがかなり大事だと思います
    [ABC364](https://atcoder.jp/contests/abc364/tasks)
1. AtCoder Beginner Contestの過去問
    ABCの過去問を解いて勉強する
    こんな時に便利なのが[AtCoder Problems](https://kenkoooo.com/atcoder/#/table)です
    左上のUser IDを入力すると解いた問題や解けなかった問題など色々みやすいです
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/d4548346-0c39-5a42-af48-15d5a05f6b84.png)

ここまで読んでいただきあざした
それではよきプログラミングライフを！
ばいちゃ