はじめに
2025/12/27のAtCoder Beginner Contest 418にて入緑することができました。やったー!
色変記事ということで、僕が入緑までにやったことを書いてみました。具体的には、解いた問題と、問題を解くときに気をつけていることを書いています。
解いた問題
『アルゴリズム実技検定 公式テキスト[エントリー~中級編]』
こちらの本です。
競プロやってみようかな~と思って最初に手に取った本です。
全部はやってなくて、おそらく第6章「応用的なアルゴリズム[中級編]」の最初のほうまででやめたと思います。
あまりやりこんだわけではないのですが、Python使いで競プロ初心者の僕にとってはPythonのサンプルコードがとてもありがたかったです。競プロの参考書のサンプルコードはだいたいC++なので。
『問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本』
こちらの本です。
こちらは一応一通り読んで問題を解きましたが、星の多い問題は飛ばしています。
同じ著者による後述の「鉄則本」と比べると、数学的な背景が比較的しっかりと書いてあるのが特徴です。多くは高校数学で学んだ内容ですが、忘れていたり馴染みの薄いトピックもあって、勉強になりました。(フェルマーの小定理とか、そういえばあったなぁ…。受験で出ても解けなかったと思うけど…)
『競技プログラミングの鉄則 アルゴリズム力と思考力を高める77の技術』
こちらの本です。いわゆる「鉄則本」。
現在のところ、競プロの勉強として一番役に立っている本です。
一通り問題を解きましたが、難易度が★5以上の問題は飛ばしています。緑を目指すための知識を得るという意味では、★4以下の問題だけでじゅうぶんだと思います。(2025年12月現在では、ですが)
★4以下を一周した段階でABCのコンテストにチャレンジしました。
実際のコンテストや後述する他の問題集の問題を解くときは、常にこの本をリファレンスとしていました。たとえば問題を見てBFSで解けそうだと思ったら、この本のBFSの問題とそれに対する自分の解答コードを見て、それをもとに解答を作る…といった具合です。
同時に、コンテストなどの問題を解いたあとは、この本の類似の問題を見直し、それに対する自分の解答コードをアップデートしていました。自分の理解を深めると同時に、次に類似の問題が出たときにコードを再利用しやすくするためです。多くの典型的なアルゴリズムについては、関数やクラスの形でまとめています。
そのようにして、この本の内容に対する理解と解答コードを育てていく作業を行っていました。その作業が入緑にもっとも寄与したのではないかと思っています。
競プロ典型90問
鉄則本の作者による、こちらの問題集です。
★4までを一通り解きましたが、★5の一問目が難しかったのでそこで挫折し、止まっています。
前述の通り、鉄則本をリファレンスとしつつ解き進めました。
問題集としてはとてもよいと思いますが、★の数とレートの関係性がいまいち分かりにくかったので進めていくモチベが上がらなかったという面はあります。
AtCoder Daily Training MEDIUM
AtCoder公式が提供している、ABCの過去問を集めた練習用コンテストです。
EASY, MEDIUM, HARDの3つがありますが、緑を目指すうえではMEDIUMが適しています。
茶色の半分を過ぎたあたりからは、ひたすらこれをやっていました。そして先述のように、鉄則本の対応箇所を見直し、自分の解答コードをアップデートしていました。どうやら39回分やったらしい。
要するに何も考えずに出された問題をもくもくと解いていただけなのですが、それが自分には合っていました。本来は自分の苦手分野を把握したうえでそれを克服するための練習をすべきなのかもしれませんが、自分の実力をデータ化して管理できていたわけではないので…。出された問題を解いて、苦手だと思ったら鉄則本を見直して復習する、というやり方で現時点では十分だと思ってます。あと、ときどきコンテストで解いたことがある問題が出るのも知識の定着という意味では役に立ちました。
多くの人は問題演習のためにAtCoder Problemsを使っているのかな…と思うのですが、僕はほとんど使っていません。
問題を解くときに気をつけていること
解いた問題としてだいたい以上ですが、ここからは問題を解くときに個人的に気をつけていることをいくつか書きたいと思います。
紙とペンを使って考える
これは多くの人がやっているのではと思っているのですが、意外と語られることが少ない気がするので…。
ある程度難しい問題の場合、問題文を一度読んだだけで理解するのはほとんど無理です。僕の場合、たいていのC,D問題は一読しただけでは理解できません。ときにはB問題もです。
僕はいつも、問題文をとりあえず一読したあと、入力例のデータをとりあえず紙に書きます。そしてあらためて問題文を読みつつ、この入力例ではどんなことが起こるかを紙の上に書き加えていきます。そうすることで、だんだんと問題の意図が理解できていきます。
手を動かすのでちょっと時間はかかるのですが、問題を理解するうえでは外せない工程だと思っています。これをサボってなんとなくの理解のままいきなりコードを書き始めるとたいてい失敗します。
上では「紙」と書きましたが、実際には紙ではなく電子メモパッドを使っています。ゴミを気にしなくていいので、個人的にはおすすめです。書き味も含めて気に入っています。欠点は部分消しができず、消すときは全消しになることです。タブレットとか電子ペーパーを使えば解決するのかもしれませんが、このためだけに買うのもばかばかしいので…。電子メモパッドは安いし軽いし使い方が単純なので、気軽に使えます。
可読性の高いコードを書く
これはあまり聞いたことがないのですが、個人的には大事にしていることです。
競プロの世界では、あまりコードの可読性が重視されていないと感じています。コンテストの公式解答例や参考書のサンプルコードでは、たいてい変数名は一文字だし、処理がメソッドやクラスに分割されていることも少ないです。
競プロの世界ではコードは使い捨てだし他人が見ることもないので、ソフトウェア開発に比べればコードの可読性の重要度はたしかに低いです。ただそれでも、僕は競プロでもある程度は可読性を大事にしたいと思っています。
理由としては、問題を解くうえで思考を整理するために役立つと思っているからです。
複雑な問題を解いていると、自分がいまどんな処理を書いているのかがよく分からなくなってくることがあります。そのままなんとなく書いたコードが通った試しはありません。
そんなとき、可読性の高いコードを書くことが思考の整理に役立ちます。具体的には、適切な変数名をつける、適切な処理のまとまりを見つけて関数やクラスに切り出す、分かりにくい処理にはコードコメントをつける、などです。それをするためには、自分がいまどんな処理をしているかが正確に分かっていないといけないからです。
解答を可読性の高いコードで作れればある程度自信を持って提出できますし、もしバグっていてもデバッグがやりやすくなります。
手数は増えてしまうのですが、難しい問題であれば思考を整理することのメリットが圧倒的に勝ると思っています。
このテーマは具体例を出して改めて書きたいなぁ…。
おわりに
僕がやったことや考えていることをつらつらと書いただけですが、だれかの参考になれば幸いです。
いったんの目標は達成したのだが、次の目標は緑の真ん中らへんまで行くことかな…。次回で茶色に戻される可能性もあるので、緑の地位を盤石にしたい。
まだ水色パフォーマンスを出したことがないので、水色を目指すためには大きな階段をもう一段登る必要がある。そもそもE問題を解いたことがないのでそれを解くのと、あと鉄則本の★5以上の問題を解く必要がありそう。
あまり根を詰めすぎずに持続できるペースでやっていきたい。
