灰色コーダーのポエム
こちらはQiita 競技プログラミング Advent Calendar 2020 5日目の記事です。
この記事を書く理由
こちらが私のコンテスト実績になります。
このような成績でも私はAtCoderのコンテストを楽しんでいます。2020年2月に初めてコンテストに参加してから、継続的にコンテストに参加しています。が灰色のままです…。
AtCoderへ参加している人達の記事などを読ませて頂くと『レートを上げるための方法』や、『何ヶ月で○色になった』など有意義な記事が多いです。
そんな中、1年ほど参加しているのにも関わらず灰色のままという私(若干恥ずかしい)の現状を書いてみるのも誰かには需要があるかもしれないと思いました。ぜひ反面教師にしてみてください。
※ポエム記事のため競技プログラミングのテクニック的な話はしないです。
簡単に自己紹介
私は28歳の時に他業種からIT業界に転職しました。卒業した学校も情報系ではなく転職した当初はかなり苦労しましたが今年で6年目になります。普段は客先常駐し、短期間で色々な案件に参画し、その都度Java、C#、PHPなど言語もフレームワークも変えながら開発業務やテストを行っています。一人で詳細設計〜開発〜テストをしてインフラチームに納品したこともある程度の能力です。
練習問題を解かないor解く量が少ない
AtCoder Problemsというサイトがあります。AtCoder過去問題集のサイトですが、非常によくできております。AtCoderを本気で取り組んでいる人は大体この問題をめちゃくちゃ解いています(全部解いてからがスタートという人も…)。
また、通称『蟻本』と呼ばれるプログラミングコンテストチャレンジブックという本もあります。こちらも問題が載っていて解いている人が多いです。
競技プログラミングの問題は『クセ』のようなものがあり、パターンを知っていれば解ける問題もあるため上記サイトや本で過去問題を解くことはとても大切です(のようです)。
しかしそこまで大切と知っていながらも私はあまり解きませんでした。AtCoder始めた当初は問題が全然解けず絶望しました。仕事では普通に開発しているのに、実は自分はプログラミングは向いていなかったのか…。こりゃいかんと過去問を解いていた時期もあり、実際手応えも感じ始めたのですが、続きませんでした。
理由のひとつに数学の知識が足りず、問題を解くにも数学の勉強をしなければいけないと感じたからです。
例えば以下のような問題
こちらはABC180のB問題です。B問題ということは難易度が下から2番目の問題なのですが、この問題を解くためには「マンハッタン距離」「ユークリッド距離」「チェビシェフ距離」とはなんぞや?と単語を調べ、max(|x….xn|)などの記号を理解し、つまり何を問われているか理解しなければなりません。入力例をみるとなんとなく意味がわかることがありますが、回答を提出しても正解にならなかったりすると結構ハマります。
コンテスト終了後に回答のプログラムをみると「あぁこういうことだったのか」と納得することも多いですが実際に解いている最中はハマることが多いです。スマートな解決法に気がつけるかどうかもコンテストの醍醐味ですが、私の場合はまずは数学の復習から始めたほうがよさそうと感じてしまっています(つべこべ言わず過去問を解けばいいのですが…)。
これに伴いしっかり回答を復習することも大切です。youtubeで回答を生放送してくれるのですが、私はたまにしか見ませんでした。
もうひとつに違う技術の勉強が楽しくなってきてそっちばかり勉強していたというのがあります。ちょうどAtCoderを始めたころAWSを理解しろと職場で言われ、勉強を始めるとこっちも楽しくなってきてしまい、どちらかといえばAWSの勉強ばかりしていました。
コンテスト開催時間
AtCoderのコンテストは土日の21時からです。我が家には幼児が二人いるのですが、ちょうどこの子達を寝かしつける時間と被っています。
「よっしゃ今日もコンテスト頑張るぞ!」と気合いを入れている私の横で妻が子供達の歯を磨き寝かしつけようとします(私を睨みながら)。子供達もなかなか寝てくれないため寝室でも騒がしく、妻もイライラしています。
私も最初は落ち着かずに「早く解かなきゃ」という気持ちでイライラしながら解いていました。ただ、よく考えるとコンテストに出ているのは自分の趣味のようなものなので妻からすると面白くないのもわかります。
そのため子供の様子を見ながら21時間から開始できるようであれば時間の許す限り問題を解き、21時頃に寝そうであれば寝かしつけながら問題を見たり、子供達が寝た22時くらいからコンテストに参加したこともあります。そのためA問題だけ解いて満足ということが増えました。
参加が難しそうな週はいっそ諦めて「また来週参加しよう」と割り切ってしまうほうが自分と妻のストレスがたまらない方法だと気がつきました。
ちなみに半沢直樹が放送していた時期(日曜日21時〜)もテレビを優先していました。
なんで続けているのか?
ずっと成績が悪いのになんで続けているのか理由を上げると
①言語の勉強になる
②AC出た瞬間が楽しい
このふたつになります。
①に関して、私が普段仕事ではJava、PHP、C#などを使っているのですがそれ以外の言語で参加しています。
始めた当初はC++が速度面で有利ということを知り、未経験の言語でしたが勉強も兼ねてC++でやっていました。プログラマーであればCを経験しておけという人は一定数いますし、あわよくばポインタなんかも使えるようになるかもという期待もありましたが、そこまで使うことはありませんでした。
そして最近はPythonで参加しています。速度面が必要になる問題まで解けていない現状、Pythonを触っておいたほうが今後のキャリア的にも有利かなという判断で変更しました。入力で最初戸惑いましたが、色々な面で書いていて楽です。
②ですが、やっぱりACが出た瞬間はとても嬉しいです。コンテストに参加している人はわかってくれる人もいると思いますが脳汁がどばどばでている感じがします。これだけでAtCoderに参加する理由としては十分ではないでしょうか?
競技プログラミングなので当然みんな上を目指したいと思っているでしょう。でも私のように成績が下の下の下でもそれなりに楽しみや目的を持って取り組んでいる人もいます。
他の人のブログや記事を見て私は全然成績が上がらないからもういいやーと思って辞めてしまうのではなく、自分なりに楽しみを見つけてマイペースに取り組んでみるのもいいのではないかと思います。
ここまで偉そうに書いてしまいましたが、私も自分でこの記事を書いてもう一度気合いを入れ直してAtCoderに取り組もうと思いました。まずは過去問を解いて勉強し直そうと思います。