【AtCoder】中卒の主婦が青コーダーになったおはなし【競技プログラミング】


はじめまして。mayocornです。
先日のABC281で青コーダーになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1929180/81006a6e-d1da-5271-5674-c469e3834dec.png)

## 経歴
20代の主婦。旦那は競プロやってないです。
中学卒業→高校入学→高校中退→バイトを転々とする（ITに関してはSESで半年ほど働いた経験あり）→今の住所に引越してきてからは無職
趣味はゲームで、最近やっているタイトルはファイアーエムブレムエンゲージ、Splatoon3です。音ゲーやカードゲームに熱中してた時期もありました。CHUNITHMは旧レートでベスト枠15.3くらい。でものめりこむほどお金がかかるのでやめました。競技プログラミングは何問解いても無料なので続けられてます。
学力に関して話すと、高校数学は確率、論理と集合がちょっとわかるくらいで三角関数、微分積分、行列あたりは全然分かりません。青パフォーマンスをとるのにこのへんの知識が必要になったことはなかった気がします。（私が参加した回の中では）

## 競技プログラミングとの出会い
2021年9月に、42Tokyoの入学試験であるPiscineというものに参加しました。42とは世界各地に拠点がある年齢制限なしの無料エンジニア養成スクールです。

https://42tokyo.jp/

この42の入学試験は、
問題を解いて提出→他の受験者にコードレビューをしてもらってOKをもらう→自動テストでOKをもらう→次の問題
のサイクルを4週間繰り返して合否が判断されます。合格率が低めなので難しい試験だと思われがちですが、問題で躓いても周りの受験者が教えてくれるので難易度自体は低めです(コードコピペはNGだけど教え合うのは推奨されている)。コードレビューにかかる時間がネックで、問題が解けてもレビューが終わらなくて先に進めない→不合格となる人が多いので合格率が低めになっている気がします。私は無職なのでそのへんは問題なしでした。

PiscineをクリアするとC言語の基礎(型、演算子、if、for、文字列の扱い、配列、ポインタ、malloc、構造体、再帰関数、簡単なアルゴリズムあたり)はなんとなく理解できてる状態になります。AtCoderでいうとA～B問題は解けるようになってる感じです。
コードレビューをしてるうちに参加者とめっちゃ仲良くなれるのでお友達がたくさんできます。Piscineが終わってもまだまだ問題が解き足りない！もっと解きたい！て感じのPiscineロスに陥っている人たちが多かったので、その人たちで競技プログラミングを始めることになりました。

## やったこと

### 茶レートまで

- どの言語で参加するか悩む。C++かPython3がおすすめらしいのでその2択に。42TokyoのPiscine101というPythonを学ぶイベントに参加していたのでとりあえずPythonで始めた。

- とりあえず[アルゴ式](https://algo-method.com/)を順番に埋めようとするが3日くらいで飽きる。問題を解くというより勉強してる感じが強かったからかも。入力の受け取りと全探索をやった。Pythonの解説コードもあるのが嬉しかった。

- PythonでABCに初参加　AB2完

- PythonからC++に持ちかえる。理由としては解説コードがC++で書かれていること、ACLがあるのでライブラリ整備をサボれること、実行速度が速いので簡単な解法で通しやすいこと、友人が全員C++を使っていたので合わせた方が相談しやすいことなどから。C++に変更してよかったと思うし後悔したことは一度もないです。

- ABCの過去問埋めを始める。AtCoder公式が出してる解説動画が分かりやすいのでそれを見ながら勉強した。解けない時は知識不足が原因なことがほとんどなのでどんどん解説ACをした。解説記事の方は難しくて私には読めなかった。（今もまだ読めないです。。。）
[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)で友人と解いた問題の数とかDiffを競ってた。 これはかなりモチベになったので、同じくらいのレートの知り合いを作ると成長がはやいと思う。

- [競プロ典型90問](https://atcoder.jp/contests/typical90)を始める。解けない問題が解説を読んでも分からないので挫折した。解説動画がある問題を優先的に解こうという方針に。

- プログラミングコンテストチャレンジブック(通称・蟻本)を買う。目次だけ読んで枕になった。 今でも難しくて読めない。

- AtCoder Problemsでバーチャルコンテスト(バチャ)の存在を知り、毎日7:30～8:30に開催されるあさかつ、21:00～22:40に開催されるくじかつに参加するようになる。

:::note info
勉強したアルゴリズム
全探索、順列全探索(next_permutation)、累積和、imos法、しゃくとり法、区間スケジューリング問題、二分探索(lower_bound)、めぐる式二分探索、DFS、BFS、bit全探索、素数判定、modの扱い、UnionFind、DP
:::

特にDPの理解にとても苦しみました。いろんな記事を読んだけど全然分かりませんでした。
より分かりやすい解説を探して出会ったのがこの問題。この解説動画で私もDP入門できました。DPに躓いてる方は試してみてください。

https://atcoder.jp/contests/abc211/tasks/abc211_c


https://www.youtube.com/watch?v=Zu9S_kJ-7tk&list=PLLeJZg4opYKb5AsMhc2t62lNBHCgb447B&index=3


### 緑レートまで

- HHKBを買う。コーディング速度が爆上がり。

- [除夜の鐘コンテスト](https://kenkoooo.com/atcoder/#/contest/show/20c1b9b6-8de8-4468-b01f-bdbc4df5e6e4)という大晦日に問題を解きまくるバチャに参加。108問中69問といた。73問目からの緑Diffゾーンには突入できなかったけど茶色コーダーとしては大満足。いいお正月が迎えられた。

- 毎日21:00～行われていたくじかつがなくなってしまったので自分でまよコンというバチャを立て始める。最初の方は私が手動で立てていたんですが最近は友人の[Paracanthrus](https://twitter.com/paracanthurus42)が自動で立ててくれています。いつもありがとう。

- 引き続きABCをどんどん埋めていく方法で精進。

:::note info
勉強したアルゴリズム
繰り返し２乗法、ダイクストラ、ワーシャルフロイド、ベルマンフォード、クラスカル法、プリム法、XORの性質とか
:::

### 水レートまで

- DPまとめコンテストを埋めようとするも、FのLCSのところで挫折。解説は[かつっぱさんの動画](https://www.youtube.com/playlist?list=PL3Hpv03CoZ24l1sf3ogcAuF1pqmgyKzqL)が分かりやすかった。

- バチャとその復習を繰り返してAC数を増やしていった。逆にバチャに出た問題以外はほとんど手をつけなかった。

- Codeforcesのコンテスト(Educational Codeforces Round 125)に初参加。英語が読めなくて０完。解説読んでも何言ってるか分からない。先に日本語の問題を埋めようと思った。

:::note info
勉強したアルゴリズム
トポロジカルソート、包除原理、半分全列挙、LIS、LCS、セグメントツリー
:::

### 青レートまで

- エンジニアになろうかなと思い競技プログラミングをする時間を減らして開発の勉強をする。

- 紆余曲折あってエンジニアになるのをやめる。完全に主婦になる。主婦が競技プログラミングをやってても絶対に役に立たないので楽しむことを目的にして続けることにした。

- バチャが楽しいのでまよコンだけ続けた。コンテスト後の復習とかバチャの復習はとことんサボった。レートが停滞した。

- レートが停滞してもちょこっとずつ上がってはいたので、その後も毎日バチャ、時間があるときに復習という感じでだらだら続ける。競プロ再開して半年くらいで青に。水→青は新しいことを学んだんじゃなくて、解くのに時間かかる問題を速解きできるようにしたって感じかも。

:::note info
勉強したアルゴリズム
強連結成分分解、Mo's algorithm、Z-algorithm、行列累乗
:::

## やる気を維持するためにやったこと

- __streakを切らさない__

毎日ACしました。streakランキングもあるので1個でも順位を上げることをモチベにしてます。
競プロやる習慣がつくので始めたばかりの人は特におすすめ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1929180/bba6ddd6-1b2a-0bf6-1038-b39a5207082b.png)

- __まよコン(バーチャルコンテスト)__

毎日21:00～22:40に[AtCoder Problems](https://kenkoooo.com/atcoder/#/contest/recent)上でABC形式のバーチャルコンテストをやってます。用事がない日は基本的に参加してます。
みんなでわちゃわちゃ問題解くのが楽しいです。よく参加してくださる方は勝手にライバル視してます。
解いたことある問題を解き直すのもレート上げるのに効果があると思ってて、バチャがその良い機会になってます。解いたことある問題が解けなった時の焦りから精進モチベが出たりします。
裏技的にはバーチャルコンテストの参加者の得意不得意を把握して、本番の順位表から解法をエスパーするのに使っています。

## やってないこと
- ライブラリ整備
ACLを頼ってます。ちゃんと整備したいのですが、Ｃ＋＋の知識が乏しくて他人のライブラリが読めないので後回しにしちゃってます。

- 本を読む
勉強してる感が強くて楽しくないからやってないです。旦那はアルゴ×数学本と鉄則本を面白いと言いながら読んでいたので向き不向きがあるのかも。


## コーディング環境とか
デスクトップPCでOSはWindowsです。コーディングは VSCode + WSL2 でやってます。このへんの環境構築はPiscineの時に教えてもらいました。VSCodeの拡張機能はCodeRunnerとVimを入れています。

キーボードはUS配列のHHKB。キーが押しやすくて打ち間違いが減りました。遠くのキーまで指が簡単に届くのもストレスフリーでいいです。ただ矢印キーなどはキーを2つ抑えなくちゃいけなくてそれはそれで大変なので、VSCodeのVimの拡張機能をいれてhjklで移動できるようにしています。慣れるまでは地獄だったけど慣れてきたらすごーく快適。


モニターは2つ使っていて、サブモニターは順位表を開きっぱなし、メインモニターは問題とエディターを半分ずつ分割して使ってます。

ツール系はコンテスト中に推定パフォーマンスが出るac-predictorが便利なので使っています。

使ってるユーザースニペットは `co` ってうつと `cout << << "\n";` って出てくるやつくらいで、全然更新してないです。

あとコーディング中はずっと音楽聞いてます。音楽なしだと不安になって落ち着かない。

## 最後に
黄色までは頑張りたいと思います。
[まよコン](https://kenkoooo.com/atcoder/#/contest/recent)に毎日いるので、AtCoderユーザーさんは参加してくださると嬉しいです！