見出し画像

【登録から】AtCoderデビューして3か月やってみた!【入緑まで】

はじめまして! 霧しゃまです。
巷で話題のAtCoderで競技プログラミングを始めてみたら超!エキサイティング!!だったので、もっと界隈近辺のみなさまと繋がってみたいと思い立ち、このたびnoteを立ち上げました。
約3か月やってみてちょうど入緑できたので、デビューから入緑までの振り返り、まとめて書いちゃいます! みなさまどうぞお付き合いください!

ざっくりプロフィール

ハンドルネーム:霧しゃま(AtCoderId: Kirishima)
アイコンの鳥さん:ヒシクイだったと思う
インターネット歴:20年以上、古のオタク
プログラミング歴:よくわからないけどかなり長い
AtCoder歴:2022年11月から、初RatedはABC276
使用言語:競技プログラミングのために仕込んだC++
趣味:プログラミング、その他雑多なものがいろいろ
好きなゲーム:ことばのパズル もじぴったん(PS2)
その他:最近のコミュニティは不慣れなのでお手柔らかに><

ヒューリスティックは未着手ですが、興味はあります

忙しい人向けのまとめ(産業でおk)

・霧しゃまはAtCoder新人だけどプログラミングは新人じゃないよ!
・半分勉強半分ゲームとしてやってるよ! 鉄則本にはお世話になったよ!
・これからTwitterなどにも手を出して何か交流したいと思ってるよ!

【入灰1】AtCoderを始めるまで

(ここからちょっとテンション落とします)
AtCoderのことは、「競技プログラミングという界隈がある」くらいの漠然とした認識でした。つまりよく知らなかったのです。
でも、プログラミングは長いこと趣味としてやっていて、「アルゴリズム」というものにも興味があって、もっと勉強したいけど取っ掛かりが掴めないでいたのです。
大きな書店のアルゴリズム系のコーナーに行くと、かの有名な「蟻本」や「螺旋本」をはじめとする競技プログラミング関連の本がありましたが、これらは大抵C++で書かれていて、C++について「複雑」という先入観を持っていた霧しゃまは後回しにしていたのでした。
2022年の11月になって、ようやっとC++とアルゴリズムを一緒に勉強するという覚悟ができ、まずはC++入門(APG4b)に手を付けたのです。
そして、その2日後にあったABC276に凸して、デビューを果たしました。

【入灰2】霧しゃまのスペック

あんまり擬態の新人っぽく思われてもいけないので書いておきますが、霧しゃまはゲーム制作の経験があったり(WWAやウディタを触りました)、趣味・学業・仕事などのためにそこそこたくさんの言語を通ってきているので、まるっきり初心者というわけではありません。
それにしても、アルゴリズム力という面ではABCで3完程度の実力からスタートしました。数学はざっくり学んできているものの、もともと得意ではなくほとんど使っていなかったこともあって、学びなおしが必要でした。
名のあるアルゴリズムはほとんど知らず、簡単なものなら読めばかろうじて理解できる程度で、自分で書いたり使ったりすることはできませんでした。
スタートラインはそんなところです。

【入茶1】精進スタートダッシュ

競技プログラミングに取り組む一番のモチベーションは、アルゴリズムの勉強をして高度な問題が解けるようになりたい!という気持ちです。
やるからには、AtCoder Problemsで赤以上がつくような超絶難問も解けるくらいのアルゴリズム力を身につけたい!という野望を持っています。
一方で、レートも相対的な指標であるものの、問題の難易度に対する自分の実力の目安になったりするので、積極的に上げていきたいという思いがありました。
AtCoderのレートは参加回数による補正があることを除けば「平均値」なので、手っ取り早くレートを上げるには、早いうちから高いパフォーマンスを出せるに越したことはないのです。この辺は半分ゲーム感覚です。
ということで、精進は毎日、2つの方針で行っています。
・ABCの過去問は解けそうなものから、時間を計って行う。
・鉄則本(『競技プログラミングの鉄則』)などで網羅的に知識をつける。
過去問演習は灰茶緑を毎日、各1問以上ずつ解くことを目標にしました。灰色の下の方は簡単すぎることも多いですが、やっぱり慣れていないと本番で問題文を読み間違えたり、解法がすぐに出なかったりしてロスになるので、「知的瞬発力を鍛える」という名目でやっています。
気持ちとしては、毎日1%の成長を積み重ねれば複利マジックで大きな成果になると考えてやっています。
鉄則本と呼ばれる『競技プログラミングの鉄則』にはとてもお世話になりました。基礎的な考え方が網羅されているので、まさに攻略本、スターターキット、知の高速道路などと呼ばれる通りです。これを半分くらい終えた12月のABC282で入茶しました。

【入茶2】Twitterに憧れる

中の人が古い匿名インターネット時代の人間なので、リアルとの境界が薄くなりがちなSNSなどはずっと避けてきたのです。アカウントを作ることもなく、いわゆるROM専でした。
単に情報収集だけならよいのですが、AtCoderのコミュニティは見ているうちにその輪の中に入ることにも興味が出てきてしまい、こうして「霧しゃま」として出現するに至ったのです。Twitterはまだ作っていませんが、近いうちに準備します。
ちなみにIDがそうであるように、ハンドルネームの由来は「霧島」です。赤コーダーになったら、「赤霧しゃま」を名乗りたいですね!
入茶したあたりで一度色変記事を書くことも考えましたが、まだコンテスト参加回数が少なく「自分に合ったレート」が確定していなかったので、10回くらい出るまでは保留することにしました。(内部レートは緑になっていたので、そのくらいで入緑する見込みもありました)
何より、インターネット上のコミュニティに入るのがものすごく久しぶりなので、いろいろ心の準備などが必要だったのです。

【入緑1】本当の始まり

ABC286で初の5完、ABC287ではあと一歩のところで5完を逃しましたが、無事に入緑できました。とりあえず最近の緑問題はそこそこ食らいつけるようになってきたので、今後は過去の水色問題の精進も始めつつ、難しい問題への挑戦を楽しんでいければと思います。

ちなみに入緑時点で、水色以上の問題は手つかずです★

【入緑2】色変記事特有のインタビュー

Q. 精進する際の工夫は?
A. 1問1問を大事にすること。
配列の添え字を間違えたとか、オーバーフローしたとか、そういう凡ミスも見過ごさず、「自分はこういう場面でこういうミスをしがち」という傾向を掴む。
そして、灰色のやるだけ問題も手を抜かない! 意外と「基礎動作」を抽出した問題が詰まっていて、それを瞬時に取り出す練習になる。高度な問題も基礎の組み合わせで分解できる場合があるので、とにかく基礎は大事!

Q. 精進環境は?
A. Windows11+WSL+VSCodeの手元環境。提出までは自動化していない。
ブラウザはEdge。お気に入りの拡張機能は……
・AtCoder Easy Test(入出力例のテストをボタン一つで行う優れもの)
・AtCoderResultNotifier(提出結果を画面上に通知してくれる)
・ac-predictor(競技後にレート変化がすぐわかるのが実際助かる)
また、精進ノートはもともと知識集約用に使っていたSimplenoteというアプリでつけている。文字で文章として理解したい頭なので、ほとんど全部文章で書く。ゆえにグラフや幾何なんかの図形・空間問題が若干苦手。

Q. 学習したアルゴリズムやデータ構造は?
A. 鉄則本に載っているものは一通りやった。
ライブラリとして持って使っているのは、
・切り上げ除算(A問題で頻繁に使うイメージ)
・十進数の各桁の和(『ちらし寿司系』と呼んでいる)
・繰り返し二乗法、ダブリング
・伝家の宝刀†二分探索†(王道を往くめぐる式)
・セグメント木(区間更新系や遅延評価は未着手)
・RollingHash(mod2^61-1, 基数は乱択)
・逆元とmod二項係数
・DFSやBFS
・Union-Find(計算量は逆アッカーマン関数)
・トポロジカルソート
・ダイクストラ法
・ワーシャルフロイド法(一番好き。初の5完で使った)
・フォード・ファルカーソン法(本番では使えていない)

Q. やった方がよいこと・やらなくてもよいことは?
A. 最初に鉄則本を一通り頭に入れて、概略だけでも知っておくのは非常に有効。解説を読むときなどに理解の助けになる。
数学は苦手でも演習を通して少しずつ慣れるしかない。結局のところアルゴリズムは数学なので、苦手意識を早いうちに除いておくのが吉。
生活リズムは乱さないのが吉。中の人はかなり朝型なので、ABCが日曜夜になったりすると結構つらい。でも参加しちゃう。
早解きはレートを安定させたり、難しい問題に挑戦する時間を確保するために身につけると吉。バチャはまとまった時間が取れないので参加していない。代わりに過去問演習で時間を計っている。
AtCoder ProblemsのStreakは、茶緑101日目指すみたいなこだわりが出てくると邪魔になるかも。霧しゃまは切るに切れなくなっている。でも達成感が得られるからヨシ!
参加回数が少ないときにARCに無対策でRated参加することは、レートの上昇を止めるという意味でも非推奨。見かけのレートが上がっても、内部値が下がっている場合がある。AB問題の難易度の幅も大きく、安定が難しい。

Q. 言語選択についてどう思う?
A. 霧しゃまの場合はPythonやJava、Javascriptなどそこそこ多様な言語に触れているので、文脈に沿った言語を選択できただけ。C++もやってみたら(STLのインタフェースに統一性がないなど気になる部分はあったものの)すぐに慣れたので、これで良かった。
競プロ用途で身につけた言語がアプリケーション制作など他の文脈で直ちに役立つわけではないので、ある程度複雑な文法に耐えられるならC++、本当に初めてプログラミングに触れるとかならPythonでよいのでは? 
それよりも、アルゴリズム等の概念を理解することがよほど大事。蟻本をはじめとする一定量の高度な知識がC++ベースで記述されているので、文法的に遠いPythonだと苦労しそうというイメージはある。そして、そのあたりを抽象的に捉えられる人ならどんな言語でも戦えると思う。

おわりに

「いかがでしたか?」ってこういうときに使えばいいのかな?
本当はもっとゆるい感じでやりたかったのに、中の人がカタブツなせいでとっても硬派な文章になっちゃったよ!! でもこれもご愛敬ということで?
今後は、コンテストの参加記録や問題の解説なんかもやっていけたらいいなと思っているので、どうぞよろしくお願いします!
以上、霧しゃまでした!

この記事が気に入ったらサポートをしてみませんか?