社会人競プロerが6年かけてAtCoder黄色になるまで

2024年9月7日、AtCoder Beginner Contest 370で黄色に到達しました!

https://x.com/tobisatis/status/1832423259440345214

初参加が2018年9月1日で、黄色になるまで6年をかけました。いわゆる初めての色変記事というやつで、競プロをはじめてから黄色到達までを振り返ります。原則時系列順に書いていくので、練習の様子、AtCoderをやっていたおかげで就職できた話などがランダムに出てきます。問題の内容については、一部リンクを掲載するものの、ほとんど書きません。

スペック

  • 黄色到達当時28歳
    • 競プロ初参加は22歳、大学卒業半年前
  • 現役ソフトウェアエンジニア
    • エンジニア歴は合計で4年ちょっと
  •  経営学部卒
    • 数学は大学1年生の微積と線形代数まで、プラス統計を少々
    • 計算機科学の前提知識はゼロ

初提出まで

プログラミングを始めたのは大学2年の頃だった気がします。一定間隔で音を鳴らすタイマーが欲しかったので、見よう見まねでC#で作りました。大学3年の暇だった頃にふとオンラインゲームが作ってみたくなり、無料レンタルサーバーを使って遊んでいました。HTML、JavaScript、PHPを少し覚え、データベースとの接続ができたあたりで満足して(面倒になって)やめました。

競プロを始めたのは大学4年の夏休みです。暇だったのでなんとなく難しそうなことに挑戦したくなり、見つけたのが競プロでした。

ある程度過去問を見てから初参加したABC108は、Aのみの1完でした。浮動小数点数などを理解しておらず、提出にはC問題で阿鼻叫喚している様子が残っていました。

水色到達

ABC126より前のABCは4問体制で、Rated上限は1200でした。この節目である水色に達したのは2019年1月、初提出から約4か月後でした。

あくまで個人的な体感ですが、当時水色まで到達するのは今と比べるとずっと簡単だったように思います。ABCのC問題によく置かれる300点は、基本的なソートや全探索ができれば解けるといった問題が多かったように感じています。D問題は解けないことのほうが多かったのですが、運良く解けると上限である1600程度のパフォーマンスを得られ、これが5回ほど積み重なって水色になりました。

成功した回の問題を見返してみると、本当に運良く解けたという印象でした。難しいデータ構造などは不要で、実験してみたものをコードにしてみたら未証明ながらたまたまACしてしまった、という単なる幸運だった気がします。

当時どのような練習を行っていたかはよく覚えていないのですが、基本的なデータ構造やアルゴリズムも習得できていませんでした。セグメント木はもちろんのこと、基本的なDP、二分探索、ダイクストラ法、union findあたりも理解していたか怪しいです。

青色到達と一時引退

水色に到達したおよそ4か月後の2019年5月のABC126から、ABCがRated上限2000の6問体制になりました。Ratedなコンテストが増えて喜んだのですが、D問題やE問題が解けてもあまりレートが上がらないという日々が続きました。解くのが遅いため同点でも順位が低い、解説を読んでも理解できないアルゴリズムが登場するなど苦しい体験が続き、ABC134を境にABCへの参加をやめました。

一方AGCでは、レートを上げることができていました。A問題に加えてC問題以降の問題が1問でも解けると青や黄色パフォーマンスが得られ、かつ当時は1回も提出しない場合はレートが変動しないという仕組みだったため、C問題以降のどれか1問に自信があるときだけ提出するという戦略(提出がWAで0完となり、大きくレートを溶かしたこともあります)でAGCのみに出続けました。しばらく無提出が続いたものの、AGC046と047でパフォーマンス2000超を得て、2020年8月に青色に到達しました。

このタイミングで一時的に引退をすることになりますが、青色という節目を迎えたからではなく、選んだ戦略の無謀さに気づいたというのが大きいです。AGC047では開始90分後の提出で800点を獲得できたのですが、その後A問題をACするまでに41分、終了9分前でした。幸運にも閃いてC問題以降が1問解けても、A問題を解き切ることができないとこの戦略は成り立ちません。結果的にABCでもAGCでも勝てる自信を失い、競プロから離れました。

就職と競プロ復帰

2020年は主に個別指導塾を運営していた時期でした。本格的に活動し始めたのは同年6月からなのですが、これはコロナが流行していた時期でした。頼りにしていた宣伝のチャネルが働かず、集客に苦戦しました。なのでわりと暇でした。

そんな中、WantedlyというSNSにエンジニア面接のお誘いが届いていました。2024年10月現在も勤めているモノグサ株式会社からです。プロフィールにAtCoder青という情報を載せていたことが縁になりました。詳しい話は別記事があるので、ご興味のある方は読んでいただければ幸いです。

しばらくして、競プロに復帰するきっかけとなるイベントが発生します。2022年2月5日、モノグサプログラミングコンテスト2022(ABC238)の開催です。前後しますが、僕の入社の後にも競プロ勢が入社してきたという理由で、交流の場として競プロ部を立ち上げ、その部長になっていました。自社がスポンサーになっているABCに、競プロ部の部長が出場しないなんてことはプライド的に許されません。数か月前からできる限りの練習を積み、ABC238に備えました。

結果はパフォーマンス1543、レートは10減って1628になりました。ここではABCへの苦手意識は拭えなかったものの、大幅に遅れを取っているというわけでもなさそうという根拠の薄い自信のもと、ABC専門で競プロへの復帰を決めました。

2桁順位、急降下

小さい頃から文章を読む速度が遅く、計算も速いほうではありませんでした。競プロで問題を速く解くということに関しても、競プロを始めてから黄色にタッチした今まで変わらず結構な苦手意識があります。なのでABCで勝つために、1点でも多く取るという戦略を多用しました。同じくらいの実力のプレイヤーがABCDEFを60分で解いているなら、僕はABCDEGを98分で解く、といった具合です。基本的には失敗するものの、ときどき2桁順位の大成功を収めました。成績表は荒れており、2022年から2023年にかけてはパフォーマンスが橙色と水色を行き来しています。レートは青色で安定しており、橙色パフォーマンスを7回取りながら一度も黄色にタッチしないというレアな体験をしました。

この青色での安定は、呪いなのかと思うほどの安定ぶりを発揮しました。2023年の上半期は好調で、黄色も見える勢いでした。しかし8月から2か月かけてレートが200減少するという事態に陥りました。本筋ではないので詳しくは書きませんが、長引く体調の異常が原因です。練習量とは関係ないところで実力が大きく下がるという経験をしたので、「キサマが競プロが弱いのは努力が足りないからダ!!」のようなことはボケない限り言いませんのでご安心を。

黄色到達とそれまでの練習

基本的な練習方法は、バーチャル参加、高難度埋め(メイン)、ライブラリ整備の3つです。参加していないABCをバーチャル参加で本番と同じ時間かけて解き、解けなかった或いは見ていないGやExなどの高難度の問題を長い時間をかけて取り組み、必要に応じてライブラリを整備します。

メインの練習である高難度埋めでは、解いていない問題のピックアップのためにAtCoder Problemsを活用します。difficultyが3400のような極端に難しい問題を除き、ほとんどの問題は使います。問題を開く。大体は解けないが、しばらく考えたら解説を見て、ある程度理解する。そしてその場ではコードを書かず放っておく。数週間から数か月後にまた問題を開く。2度目でも解けないものがほとんどだが、気にせず解説を見てある程度理解し、また放っておく。問題を見て解説を見ずにACするコードが書けるまで、この流れを繰り返します。解説を見てもまったく理解できない問題もあり、それは永遠に放置します。

橙色difficulty以上の問題を埋めるのは根気がいるので、1日1問くらいのペースではあるものの、個人的には結構しんどいです。それでも総合力とでも呼べるものが鍛えられているのか、高難度のAC率の上昇もありますが、ABCの中盤までの問題を解く速度も上がっているように感じています。

黄色に到達した回のABCの終了直後のAtCoder Problemsのユーザーページは、こんな感じでした。

効率が良いかはわかりませんが、2022年からはずっとこのスタイルで練習を続け、初提出から約6年後、黄色に到達できました。コンテスト中に通せた黄色difficultyの問題は自慢できるほど多くなく、得意な問題が出たときに運良く稼げた程度のものではありますが、典型問題が多いABCではひどい失敗が少なくなったために、大幅なレートの減少を避けられたのが良かった点です。

終わりに

現在はARCの過去問を解いています。ABCに比べると解けたときの気持ちよさが大きく、今のところ続けられそうです。なるべく早く参加できるように努力します。
長文を読んでくださりありがとうございます。ぜひフォローもお願いします! ⇒ About Me

コメント

このブログの人気の投稿

AtCoder ARC044 C

AtCoder ARC034 D