【入茶記事】プログラミング完全未経験者がAtCoderで入茶するまで2カ月の過程

こんにちは。北杜七星と申します。

**2025年1月11日のABC388で入茶しました！**

今回は、界隈の色変記事という習わしに倣って入茶までの過程でやったことについて書いていきたいと思います。
![スクリーンショット 2025-01-12 125333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965763/0982706d-c0c1-cb19-0606-05999f42b4ed.png)
↑8回目のコンテストで入茶！やったね！
## 目次
- [自己紹介](#自己紹介)
- [入茶までにやったこと](#入茶までにやったこと)
    - [APG4b](#apg4b)
    - [環境構築](#環境構築)
    - [コンテストに参加する](#コンテストatcoder-biginner-contestに参加する)
    - [AtCoder Daily Trainingに参加する](#atcoder-daily-trainingに参加する)
    - [基本的な典型アルゴリズムを押さえる](#基本的な典型アルゴリズムを押さえる)
    - [コンテストの動画を撮る](#コンテストの動画を撮る)
    - [精進はあまりできていない](#精進はあまりできていない)
- [あとがき](#あとがき)
- [付録](#付録)

## 自己紹介

+ 体調の不調で通信制に転校した高校2年生(AJLには前籍校で参加中)
+ 理系,情報工学志望
+ 数学はちょっと得意なくらい(数ⅡBまでの内容はおおむね理解)
+ **始めた当時プログラミングは完全に未経験(Scratchさえ触ってない)**
+ 学んだ言語はC++

## 入茶までにやったこと

### APG4b
ネットサーフィンしていたら誰かの入茶記事を見つけたのをきっかけに競技プログラミングへの興味が湧きました。
そこで**APG4b**という便利な教材があることを知りました。

[C++入門 AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/APG4b)

私のようなプログラミングを全くやったことがない人でも分かりやすいように基礎的な文法を解説しています。各節に練習問題が用意されており、自分が書いたコードが正しいか確認しながら進めることができます。

この教材がなければ私は競技プログラミングを始めることは無かったでしょう。**APG4bは偉大です**。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">APG4bを始めてみたい(三日坊主になりそう)</p>&mdash; 北杜七星 (@hkt_shichisei) <a href="https://twitter.com/hkt_shichisei/status/1859358023082442780?ref_src=twsrc%5Etfw">November 20, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
↑突然競プロの門戸を叩く自分(この頃は2カ月で入茶できるとは思わなかった)

現在APG4bはC++版と[Python版](https://atcoder.jp/contests/APG4bPython)が公開されていますが、私が始めたときはPython版の第2章が公開されていなかったのと(現在は公開されています)、競技プログラミングではC++が最もポピュラーな言語ということだったのでC++を選びました。

そこで直近のコンテストの[ABC381](https://atcoder.jp/contests/abc381)までひたすらAPG4bを進めました。コンテストまでの2日間で[多次元配列](https://atcoder.jp/contests/apg4b/tasks/APG4b_t)まで進めたわけです。本当はきりよく2章最後まで進めたかったのですがそこまでは流石に無理でした。

その後11月下旬に3章途中の[STLのコンテナ](https://atcoder.jp/contests/apg4b/tasks/APG4b_aa)まで進めましたがそれ以降は進めていません。単純に忙しくなったのが原因で、余裕が出たら再開したいと思います。

ちなみにこの教材、コンテスト中に参照することが多いです。忘れたところはもう一度見て確認するといった感じで活用しています。

### 環境構築

灰色、茶色ではAtCoderのコンテストページに付属しているコードテストで問題を解いている人は割と多いですが、私はAPG4bを始めたタイミングでVisual Studioの環境構築を行いました。理由はいくつかあります。
#### モチベーションが上がる
これは私だけかもしれませんが、自分が書いたプログラムが自分のパソコンで動いているのを見るのは結構面白いです。コーディングのモチベーションに繋がります。
#### コーディングが楽
ローカルエディタに文字を打ち込むと、予測変換候補のように変数名や関数名などを表示してくれます。これがなかなか便利です。
![スクリーンショット 2025-01-12 143822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965763/239529d0-321e-88d9-b803-38b89932348b.png)
#### デバッグが楽
ローカルエディタでは、ブレークポイントを設置してコードの任意の位置でプログラムを一時停止させ、変数の中身を確認しながらデバッグすることができます。ランタイムエラーもどの位置で起こるか特定しやすいので楽です。

AtCoderのコードテストも優秀なので、絶対しなくてはならないわけではありませんが、開発環境を構築するのはおすすめです。

ABC388から環境をVSCodeに変更しました。VisualStudioだとデバッグ中に書き込みエラーを吐いてビルドできなくなることが頻発していたので環境を変更して快適です。

参考(evimaさん):[競技プログラミングの環境構築 [VSCode+WSL+AtCoder Library]【ゆっくり解説】](https://youtu.be/uhnASau7fB4?si=0ltyR-KhUvZiIiW1)

### コンテスト(AtCoder Biginner Contest)に参加する

当たり前ですがコンテストに参加しないとRatingは上がりも下がりもしません。

さらに、AtCoderでは参加回数に応じRatingに補正をかける仕組みが取られています。具体的には、参加回数が少ないほど大きな下方修正がかかります。なので、特に最初のうちは参加した方が得です。APG4b一章を修了できれば(A問題はACできる)最低限の知識はあると思うのでどんどん参加しましょう。

参考:[レーティングのしくみ - AtCoderInfo](https://info.atcoder.jp/overview/contest/rating)

Rating 1200未満(灰/茶/緑)の人はAtCoder Biginner Contest(以下ABC)に参加してRatingを稼ぎます。

<details>
  <summary>ABCの問題の難易度感</summary>
    <h4>A問題</h4>
    <p>配点はふつう100点で、if文、for文、配列を扱えれば十分解くことが可能な問題が多い。しかし、競技プログラミングの問題形式に慣れていないと難しく感じることもある。</p>
    <h4>B問題</h4>
    <p>配点はふつう200点で、for文のネストを使った全探索が頻出する。愚直にシュミレーションして解く問題もある。基本的に問題文を正確に理解しコードに落とせればOK。</p>
    <h4>C問題</h4>
    <p>配点はふつう300点で、ここからは問題文に書かれていることをそのまま実装するだけでは正解できない問題が多くなる。基礎的なアルゴリズムを適用するなどして、実行時間制限に間に合うように計算量を削減する必要がある。</p>
    <h5>実行時間制限/計算量とは</h5>
    <p>コンピューターも計算するには時間がかかります。ロジックが合っているとしても、計算に数年かかるプログラムは正解とはなりません。ほとんどの問題では2秒以内にプログラムの処理が終わる必要があります。2秒以内にできる計算はだいたい10^8回です。<br>参考:APG4bより W - 2.06.計算量 https://atcoder.jp/contests/APG4b/tasks/APG4b_w</p>
    <h4>D問題</h4>
    <p>配点はふつう400点で、C問題よりも難易度が高い問題が多い。AtCoderProblemsで茶色や緑色になる(≒茶色や緑色の人の半分くらいが解ける)問題が多い。</p>
    <h4>E問題</h4>
    <p>配点はふつう450~475点で、複雑な考察や高度なアルゴリズムを求められる。コンテスト中に解けたことがない。Problemsで緑色や水色になる問題が多い。</p>
    <h4>F問題</h4>
    <p>配点はふつう525~550点でまあ難しい。"Beginner"とは思えない。Problemsで青色や黄色になる問題が多い。</p>
    <h4>G問題</h4>
    <p>配点は600点程度で、ABCのラスボスとなる問題。Problemsで黄色以上になる問題が多い。</p>
</details>

---

私が初めて参加したABC381の成績を見ていきましょう。
![スクリーンショット 2025-01-12 134528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965763/17baa2cb-aa64-cfca-50bf-00218b7cd051.png)
2完でした。150点の問題を解くのに20~30分ほどかかっていますね。

コーディング速度は慣れもあるので、最初のうちは100点問題や150点問題に10分以上かかっても仕方ないと思います。どんどん問題を解くことで慣れてコーディング速度も上がっていきます。

実際、ABC382以降ではA問題(100~150点)を2分~5分、遅くても10分で通せるようになっています。

何より最初はコンテストに参加すればするほど(参加回数による補正が緩和されて)Ratingが上がるのでモチベーションになります。

### AtCoder Daily Trainingに参加する
[AtCoder Daily Training](https://atcoder.jp/contests/adt_top)(以下ADT)は毎週火、水、木の週3日にそれぞれ3回ずつ行われているABC過去問バーチャルコンテストです。

ADTでは難易度別にEASY,MEDIUM,HARDの3段階とEASYからHARDのすべての問題を含むALLが用意されています。

EASYはABCのA問題~C問題、MEDIUMはABCのB問題~D問題、HARDはABCのC問題以降から出題されます。

私は当初、EASYに参加していましたが、12月10日の回にEASYを全完したのをきっかけにMEDIUMに参加するようになりました。

茶色になるためには、コンテストごとの難易度差はあるものの、比較的簡単な回ではC問題は通すことが望ましいです。C問題に慣れるためにも、EASYでB問題が安定して解けるようになったらMEDIUMに参加することをおすすめします。

私は茶色になるまであまり精進をしませんでしたが(後述)、週3回はADTに参加することでそれを補っていたと思います。

### 基本的な典型アルゴリズムを押さえる
立派に書いていますが、正直言って私はアルゴリズムの勉強はほとんど行いませんでした。どちらかというと典型に当てはめるというよりは一から考えて実装している方が多かったです。

ただ、コンテスト後にXを観測したり、[AtCoder公式チャンネル](https://www.youtube.com/@AtCoderLive)で行われる解説放送を見て、典型のアルゴリズムについての知識を深めました。しかし、自力で実装できるレベルまで持っていくわけでもなく、「こんなアルゴリズムがあるんだ。へ～」くらいにしか思っていませんでした。

アルゴリズムを知らなくても、どうにか工夫して計算量を落とすことができればACできるのでなんとかなる場合もあります。(もちろん正解できなかった場合文句は言えませんが)

そんなわけで、今自力で実装できるアルゴリズムは尺取り法、BFSくらいしかありません。

とはいえ、今後入緑に向けては典型アルゴリズムを押さえた方が楽なので(というより今の状況が褒められたものではない)、「競技プログラミングの鉄則」という本(通称"鉄則本")を購入しました。今後進めていきたいと思います。

参考:[競技プログラミングの鉄則 | マイナビブックス](https://book.mynavi.jp/ec/products/detail/id=131288)

### コンテストの動画を撮る
コンテストの復習は大事です。コンテスト中に動画を収録し、それを見返すことでどのようなところに時間がかかっているかを見直すことができます。

私の場合、同時にアウトプットとして実況動画を制作し、投稿するという試みを始まました。競技プログラミングを知らない人向けの編集を心がけることで、理解を深め直すことができます。
拙作:[ABC388の実況動画(ニコニコ動画)](https://www.nicovideo.jp/watch/sm44506896?ref=garage_share_other)

ここまでしなくとも、復習に役立てるためにコンテスト中の動画を撮ることは良いことだと思います。

### 精進はあまりできていない
競技プログラミングは精進(過去問をひたすら解くこと)が上達の近道とされています。しかし、私の精進量は多くはありません。

多忙のために精進のためのまとまった時間を時間を確保できませんでした。

![スクリーンショット 2025-01-17 202817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965763/3e1759ab-f4fe-2c03-dcc8-4036336dacc2.png)
2025/1/17時点の精進の全貌(濃い緑色がコンテスト中に正解、薄い緑色がコンテスト後に正解)
[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/Sa15MiyagiJapan)

画像を見ていただけるとわかると思うのですが、ほとんど精進らしい痕跡はありません。その代わりにADTに出て、演習を重ねていました。

今後は入緑に向けて、まとまった精進時間を取りC問題、D問題を埋めていこうと考えています。

## あとがき
競技プログラミングは問題を解くのがとても楽しいです。この記事を読んで私のように興味を持って、コンテストに参加してくれる人が出てくれると嬉しいです。

今年中の入緑を目指します！入緑記事でお会いしましょう！

## 付録
参考として入茶までの成績を載せておきます。

|コンテスト | A | B | C | D | E | F | G | 計 | Perf | Rating
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  ABC381 | 150  | 150  | +1  |   ||||300|284|14|
|  ABC382 |  100 |  200 |  350+1 |   ||||650+1|601|71|
|  ABC383 |  150 | 250+1  |  +1 |   ||||400+1|424|114|
|  ABC384 |  100 | 200  | 300  | +5  ||||600|521|162|
|  ABC385 |  100 | 200  | 350  |   ||||650|767|243|
|  ABC386 |  100 | 200  | 350  |   ||||650|790|323|
|  ABC387 |  100 | 150  |   |   ||||250|655|370|
|  ABC388 |  100 | 200  | 300+1  | 400  |+2|||1000+1|791|438|