今日はキャリアブレイク中に具体的にやっている勉強について書きます。結構色々やっているのですが、最初に書くのは「アルゴリズム問題を解く」です
アルゴリズム問題を解くことに興味はなかった
自分は去年ぐらいまでアルゴリズム問題を解くことは殆どありませんでした。あまり重要視していなかったし、Paizaなどで遊び程度でやった時もあまり意義は感じていませんでした。それよりも物作りの方が楽しいので、そっちに時間を割きたいと思っていました。
コミュニティがきっかけで初めてみる
ところが、自分が参加しているコミュニティでアルゴリズム問題を解くことを重要視しているので、それがきっかけで解くようになりました。ちゃんとやってみると普段使っていない部分の脳が汗をかくような感じがして、プログラマの筋トレ!?として良いかもと思うようになりました。
とはいえ解くのは難しい
そのコミュニティで20問ぐらい解いたと思いますが、正直得意ではないなとずっと思っていました。短い時間で解けることは少なく、説明を聞いてもすぐに実装出来ないことも多かったです。自分としては解くことを日課にして基礎力を上げたいという思いがあり、今回アルゴリズム問題を解くことを日々の勉強課題にしました。
LeetCode→NeetCode
そのコミュニティではLeetCodeを推していました。自分もとても良いサイトだと思いますが、勉強を初めてから知ったNeetCodeが自分には一番合っていると感じました。なので今は日々NeetCodeを使っています。ちなみにNeetCodeはLeetCodeの問題を独自のルールで順番付けしたり、解説を充実させたりしているだけでアルゴリズム問題自体は同じです。
NeetCodeの気に入ったところ
NeetCodeは解いていく順番が決まっており、ジャンル毎にすすめていくスタイルです。計算量毎に回答コードが書いてあって、別途、動画の解説も用意してあります。回答の言語も多くてC#が選べます。どれもLeetCodeでも探したら見つかる気もしますが、オールインワンパッケージみたいにまとまっているところが気に入りました。気に入らない所はC#のバージョンが最新ではない所ですかねw。
自分の進め方
基本1日1時間を上限にして問題を解いています。まずは計算量を気にせず解けそうな方法を考えて解きます。ここは最大で1日考えます。解けた場合はより速い計算量で解けるかまた考えます。但し、この場合は最大で15分にしています。それで分からなければ動画を見て、それでも分からなければ回答を見た上で、自分で書けるようになるまで解きます。問題によって違いますが、1問に3日以上かけたものもありました。11月で解いた問題数は7問でした。
基本サイト上で解く
まず解く時は基本サイト上でやっていて、分からない限りググったりIDEは使いません。何となく使わずに書いたら結構気づくこともあったので、その後も使わずに書いています。デバッグもprintfが中心です(ただ、これはたまたま今回そうしただけで、基本的にIDEを使うことは賛成派です)。あと、回答を変えて解いていくとその行程が残らないので、最近は、解いた結果はGithubに残すようにしました。
翻訳しない
キャリアブレイク中の勉強の1つに英語学習もあるのでどちらかというとそのためのルールですが、「日本語に翻訳」も使わないようにしています。正直、英語のサイトとか動画とかまだ殆ど理解出来ないのですが、なぜかアルゴリズム問題に関しては結構英語が分かった気になったのでそれが嬉しかったことが大きいです。(ただ、この問題は完全に文章を読み間違えて、純粋に数独を解くアルゴリズムを考え出して無駄に2日ぐらい悩んでしまいました。。)
やってみて
こんな感じでアルゴリズム問題を解いており、解いてみた感想としては、色々気づきがあって楽しいです。HashSetとかPriorityQueueとか仕事では使ったことないし、末尾から追加していく場合はListよりArrayの方が良いなとか初めて思いました。まだ、力がついた!みたいな実感は薄いですが、同じジャンルの問題をまとめて解くスタイルは進めやすいと感じています。