アルゴリズムの勉強

最近、LeetCode漬けになってます。それに加え、競プロ界隈で初心者におすすめのチーター本を手に入れて、ボチボチ読んでます。

始まり

実はLeetCodeは数年前から知っていたのですが、easyでもバイナリツリーの問題なんか普段使わないからよくわらなく、やってて何が面白いのか理解できず、遠のいていました。それが、今年の初めから、何か技術的なことで勉強したいなあと思ってていろいろ考えていたのですが、今年はLeetCode、競プロに本腰入れて取り組んでみようと思い始めたのが始まりです。正直、実務ではこの手の問題できなくても、仕事はできてしまいます。かと言ってアルゴリズムはエンジニアとしての基礎体力なのかと思っています。できないよりはできたほうがいいのは確かです。日本ではAtCoderが有名ですが、両方触ってみた感じLeetCodeの方がサービスとした優れているのかなと言う印象です。英語も初めは読んでもスッと入ってこないのですが、解いてるうちに理解が早くなってきます。

言語

LeetCodeにおいて、言語は複数選べます。初めは、所謂定番?のC++,Javaなどを使っていましたが、普段使わない言語なんで、導入ハードルがなかなか高い感じでした。次にJavaScript, Swift普段使っている言語であります。Swiftは、使ってみた感じ相性が悪い感じがしました。エラー文が親切ではなかった気がします。Javascriptは、相性は良かった気がします。使っていた当時は、ソート問題でも、問題の意図を理解しておらず、arrayのソートを普通に使ってしまっていたので、問題が問題になっていながった感はありました。今は問題の意図も理解したので、Javascriptでも大丈夫な気がしますが。最後にPython。RebuildFM聞いていて、アルゴリズムの話でPythonの話が出ました。昔一瞬使っていましたが、特に使うことはありませんでした。 シンタックスにインデントが重要なことを知っていたぐらいです。最近ディープラーニングでもPythonがもてはやされ、人気が上がっている言語と言うこともあり、新しい言語を勉強したいのもあって、Pythonを使ってたところ、これがいい。めちゃくちゃ楽にかけます。もういつもPythonで書きたいぐらいです。例えば配列を0の初期値でN個数分作りたい場合、

arr = [0] * N

だけでいいのです。競プロを始めたくて、言語選びに悩んでいる人はPythonをおすすめします。めちゃくちゃ楽に問題に取り組めます。

問題にひたすら取り組みインプットとアウトプット

初めやっていた時は、バイナリツリーの問題も、どう言う風に解けばいいのかさっぱりわかりませんでした。結局のところ毎日取り組んでいれば、段々どう言う風に解けばいいのかわかります。問題を解いて、解けなかったら答え見て、どう言う風に解けばいいのかレビューする。解けたとしても、他にどんな風に解いているのか、他の人の解き方をしているのかレビューする。プラス、チータ本を読んで、競プロの基礎を学ぶ。初めは、BFS,DFS、DPの文字を解答などで見ても訳がわかりませんでいたが、チータ本や、有志サイトなどを見てある程度理解することができました。ほんとに、基礎的なことですが、問題をちゃんと理解して、紙に書いてどう言うアルゴリズムで組めばいいのかをイメージして、問題に取り組むことがいかに大事かを知ることができました。まだ、大会には出てないのですが、基礎体力と時間が合えば出てみてようかと思っています。

就活に有利

やっぱり、エンジニアが就職となると、技術試験、アルゴリズムを解くことは大体あります。よっぽどのスタートアップじゃない限り。あのGoogleさんだって難しめの問題を出すのは普通になっているので、エンジニアとして高みを目指すのであれば必要なスキルなのかと思っています。今の会社は、アルゴリズムの試験はありませでしたが。。。カナダに来ばかりで、就活していたときに試験でフィボナッチ数列の問題が出て全く解けなくて、苦い思いした記憶があります。これも練習不足が敗因。日々の練習が大事なのかなとつくづく今は思います。

Happy Coding :)

comments powered by Disqus