🙌

文系プログラマーおぢがAtCoderで茶色になったので振り返る

2024/04/14に公開

AtCoderという競技プログラミングサイトがあることはご存知の方も多いでしょう。
週末の夜とかにプログラミング問題の解答速度を競い合うやつです。
灰色から茶色になったのでいわゆる色変記事を残しておこうと思います。
魚拓

私のスペック

40代もそろそろ中盤に差し掛かろうかというミドルです。
大学時代からプログラミングには興味があり、インターネットの黎明期だったこともありホームページを作るためにHTML、CSSの延長でJavaScriptをちょっと弄ったりはしていましたが、条件分岐やループの取扱いもおぼつかないレベルでした。諸々ありIT業界の門戸を叩いたのですが、キャリアは話すと長くなるので大雑把に省略すると、全探索のみを頼りにしてIT業界で10年以上生きてきました。IT業界といっても多種多様なので、棲む場所によってはこのレベルのアルゴリズム力でもなんとかなってしまうものであります。

なぜ今頃取り組むのか

SESの客先常駐として旧態依然としたウォーターフォールモデルの仕様変更に振り回されたり、なんちゃってアジャイルの無茶振りで炎上したりしてるうちに若者とは呼べない年齢になり、いわゆるミッドライフクライシスに陥り愚にもつかない考えを弄んでいたところWeb系自社サービス企業との出会いが奇跡的にあり、ええいままよ!と久々の転職をしたのがつい数年前です。結構な背伸びだったのですが、低スキルでもなんとか齧り付いて仕事に勤しみ最近はようやく落ち着いて今後について考えられるようになりました。考えた結果、ハードスキルのコアに据えるのはやはりデータ構造とアルゴリズムでしょうよと思い至り、暫くぶりに競技プログラミングすることにしました。

何に取り組んだか

復帰当初は久々すぎてABCのB問題すらACが怪しいレベルでした。TLEは日常茶飯事。

プログラミング言語を変える

当初はプログラミング言語をJavaで参加していましたが、色々とダルいのでPythonに変えました。
C++といきたいところですが、使う案件は長いキャリアでほんの数回遭遇したぐらいですので習得するモチベーションがありません。Pythonならインタープリタ言語なのでビルド不要ですぐに試せるので軽快で良いです。本業でもちょっとしたタスクはPythonで書いていたのですぐに慣れることができました。

1つだけ気をつけることがあるとすれば実行環境はCPythonじゃなくてPyPyの方がJITコンパイルで早いです。もう雲泥の差です。たまにこれで救われることがあったのでデフォルトの実行環境はPyPyにしています。

問題文の言い回しに慣れる

アルゴリズム云々を論じる前に、競技プログラミングの文章、言い回しに慣れる必要がありました。文系出身ということもあり、数式がたくさん出てくると辛くなります。せめて簡単な不等式とか方程式ぐらいは流し見できるぐらいには数式アレルギーを克服しておきたいところです。昨今の機械学習の隆盛に伴い高校数学までをなんとなくおさらいしていたのが若干役に立ちました。
とはいえ灰色がまず取り組みたい問題のレベルはABCのB問題とかがメインですので、そんなに頭を捻る必要はない印象を受けます。稀に難解な言い回しが出現するときもありますがそういう時は潔く日本語の理解を諦めて例示から解法を探ったりしています。

問題を解きまくる

先人のアドバイスがネットを漁ると色々あるので、私もそれに倣い手を動かして問題を解きました。

  1. AOJのITP1
  2. AtCoder Beginners Selection
  3. AtCoder Daily Training EASY

自分が容易に解ける問題を解き続けることもコーディング速度の向上に一定の寄与があるとは思いますが、最近は解けるか解けないか一見するとわからず、若干問題文を読み込んで考察しなければならない問題をメインに攻略しています。灰色から茶色になることを目指すレベルだと、自分の場合は実装力というよりは解法を思いつくまでの考察力、論理的思考能力を高める方が効果があったように思います。なので最近はAtCoder Daily Training EASYの問題文(とくにE問題)を毎日隙間時間に眺めて考えていました。競技プログラミングの他にも色々とやりたいことがある都合上、解いて提出するところまで毎回やるほど時間は取れないです。全く実装しないというわけではなく、実装するまでわからない問題があるときはコードに落としたりしもています。

典型アルゴリズムを学ぶ

競技プログラミングの鉄則とか、有名な本は理解がおぼつかないことが多々あるものの、それなりに目を通してはいます。しかし茶色になるにあたり実際に必要だった知識は本当に基礎的なものだけでした。

  • アルゴリズム
    • 全探索
    • ビット全探索
    • 二分探索
    • 累積和
  • データ構造
    • リスト(配列)
    • 集合
    • 連想配列(辞書)
    • グラフ表現としての隣接リスト

もう少しあったかもしれませんが、このあたりが使えれば茶色にはなれました。計算量を意識する必要が出てくるのはC問題からの傾向が強いので、C問題では全探索を回せるのか考察しつつ、回せないのであればそれ以外の探索方法を検討する感じです。回せないことが大多数を占めている気がします。

今後の目標

茶色の定義を見てみましょう。
https://info.atcoder.jp/utilize/jobs/rating-business-impact

コーディングへの安心感がある程度持てます。学生や派遣社員などが茶色のレーティングを持っていたら、とても喜ばしいです。

自分もそう思いますが、シニアエンジニアとしてレビューとかする立場なのでもう少し精進しないといけない危機感があります。今年中に緑色になれたら良いな。

Discussion