概要
所謂色変記事です。2021年7月24日にABCへ初参加し、同年12月11日入緑達成したため、自身の経歴と半年間の軌跡を此処に残したいと思います。
自己紹介
- 田舎に住んでる30オーバー
- 学生時代数学は好きではなかった
- パズルは好きだった
- 名前を書いてお金払えば入れる芸術系専門学校卒
- 現在はSESで派遣されてるIT土方
- 大体API叩いてレスポンス記録したり、画面のスクリーンショット保存したりしてる
- 業務でコード触ったりはほぼ(95%以上)無い
- たまにバッチの中身いじったりする程度
- 基本的に業務で使うソフトはExcel
- 書式設定とか罫線とかフォントサイズとか列幅がえらく狭かったりするすごいエクセル
割とどこにでもいる(と思ってる)量産型エクセル職人系のエンジニアです。得意な分野はエクセルで、苦手な分野はそれ以外です。嫌いなツールはエクセルです。フロントとかバックとか全体的に広く浅い知識しかないです。githubとかDockerとか、付け焼き刃の知識しか無い程度です。基本情報もITパスポートも持ってません。
AtCoderを始めた動機
今の仕事を続けて、何かしら技術が自分の中に積み上げられないなという危機感を覚えたのが春先。5月頃の話です。競技プログラミングやAtCoderといった界隈があることは既に知ってたので、どれだけの知識技術が自分の中に積み上げられるかは分からないけど、何もやらずに人生の時間を消費するよりは何かしていたほうがマシだろう、という消極的理由でAtCoderの世界へ飛び込んでみました。
この半年でやったこと
作業環境構築
- Python3 + Docker + Visual Studio Codeで1クリックでテスト&submit環境
過去問解き
- AtCoder1Problemsを利用し、過去ABCのうちA問題、B問題は全て埋めました
- C問題も88%、D問題はわずか14%しかACしてません(解説AC、本番AC含む)
本番後の反省と復習
- ACできた問題+本番中に着手した問題(基本的にD問題、4完できていればE問題)の復習
- A〜C問題に関しても、自分とは違う強い人達のスマートな解法等を学べたのは効果があったかと思います
得た知見の言語化
- 初心者が初心者なりに理解したことの解説
- えらいひとや強い人からみると「当たり前じゃないかそんな事を解説しなくても」と思われるかもしれませんが、拙い形としてでもアウトプットを行うためには自分の中でとことんまで考えて煮詰めて芯まで理解する必要がありました
- 更に、アウトプットした後の、「役に立った」という声は自信に、「こういう応用もある」「ちょっと間違ってる」という反響はどれも自分じゃ気づけなかった部分なので新しい発見としてどれも有用でした
学習の方針
速解き重視
基本的に、「解けるdiffの問題を、安定して、より速く解く」を意識して過去問消化、精進に望んでいました。
「A問題、B問題、C問題が60分で解ける状態」であれば、本番中に次のD問題に使える時間は残り40分。この60分を50分に短縮できれば、D問題に使える時間は50分に増えます。
また、本番後の解説を確認、復習で週に1問ずつ自分の中の出来ることを増やしていくイメージです。8割以上は速解きに振った方針でしょうか。
実際に、入緑した際のタイムは、Aに1分、Bに4分(+1WA)、Cに3分、Dに12分で合計20分(+1WA)でした。本番のうち80分は新しい問題を見て必死に考えている状態でした。
また、同じようなdiffの問題を安定して解けるようになれば、本番中に大きくコケてレートが暴落する機会は減るんじゃないかとも考えています。
A、Bの灰diff埋め
速解きの速度を上げるため、A,Bの灰埋めから着手しました。「A,Bの灰diff埋めは虚無」などと言われている方もいらっしゃいます。実際に強い方からしたら「今更100マス計算をしたところで何が上達するんだ」、というような感じでしょうか。競技プログラミング始めたばかりの私には、素振りのような効果があった気はします。少なくとも、A,Bが埋まった頃には入力部分の作り方で悩むことはなくなりました。
習得したアルゴリズム
若い力は既に失われてしまっているので、「大量に公式を覚えてパターンにはめて落とす」ようなやり方ではやっていけないだろうなぁ、とぼんやり感じていました。
なので、理解したアルゴリズムはとても少ないです。
- 累積和
- いもす法
- 二分探索
- BFS(deque使いたい)
- DFS(再帰しないで欲しい)
- DP(簡単なものに限る)
- 尺取法(たまにACできる)
- 座標圧縮(たまに使えたら嬉しい)
- Union-Find(入緑の決め手となった1回だけ)
胸を張って、自身を持って「まぁ、うん、少しなら、なんとなく、どういうことしてるかは分かるつもりです」って言えるのはこのくらいでしょうか。
これでも学習量としては多かったです。どちらかというと、collection型に関する知識や、標準ライブラリ等、もう少し低い地点での知識をかき集めていました。
「n in list」でリスト内を探索すると計算量大変だけど、setなら1なのでリスト内探索するならsetでどうにかしたいな、とか。
dequeのpop,appendをleftにするかrightにするかでBFSからDFSに変形できるよね、一緒でいいじゃないですか、とか。(厳密には違うかもしれませんが)
1つ1つの理解を深めて、しっかり使いこなせるようになれば、本番で全く知らない問題が出てきてもなんとかゴリ押し対応が出来るのではないだろうかと思ってます。
新しいものを1つ覚えたとして、その1パターンでしか使えないのであれば、覚えるための労力が勿体ないな、とも…貧乏性です。
まとめ
- 全く理系でもなんでも無い社会人だけど緑まではなれた
- それほどアルゴリズムを知らなくても緑まではなれた
- 次の目標は、もちろん水色です。もう半年くらい先かなぁ…