はじめに
この記事を書いている現在(11/30)は入緑をしておらず、おそらく公開される時にも入緑はしていません!
入緑した(してない)ことよりも、競技プログラミングを通して、アルゴリズムを学ぶことにはとても価値があるということを伝えたいです。
何が嬉しいか
僕が競プロをしていてよかったなと思うことはざっとこんな感じです。
- 楽しい
- 言語に対する理解が深まる
- エスパー力がつく
- ロジカルに考えられるようになる
- コーディングテストに受かりやすくなる
楽しい
まずなんと言っても楽しいです。
解けるか解けないかレベルの問題がWJ
からAC
に変わる時の脳汁は半端ないと思います。
言語に対する理解が深まる
僕はRubyで競プロをしているのですが、競プロを始める前に比べるとRubyに対する理解が深まったように感じています。
[ [12, 33], [100, 20], [88, 0], [2, 11], [550, 1] ]
上記の2次元配列を1番目の要素の昇順でソートして、同じものがあれば2番目の要素の降順でソート
する場合、Rubyだと以下のように書くことができます。
arr = [ [12, 33], [100, 20], [88, 0], [88, 11], [550, 1] ]
puts arr.sort{|a, b| (a[0] <=> b[0]).nonzero? || b[1] <=> a[1]}
これを理解するにはComparableモジュールを理解する必要があります。
<=>
←これをUFO演算子
というのですが、UFO演算子では以下のような値が返されます。
self <=> other は
- self が other より大きいなら正の整数
- self と other が等しいなら 0
- self が other より小さいなら負の整数
- self と other が比較できない場合は nil
irb(main):001:0> 1 <=> 3
=> -1
irb(main):002:0> 3 <=> 1
=> 1
irb(main):003:0> 1 <=> 1
=> 0
irb(main):004:0> "hello" <=> 1
=> nil
これを踏まえると、sort{|a, b| (a[0] <=> b[0]).nonzero? || b[1] <=> a[1]}
を見ると、1番目の要素を基準にソートa[0] <=> b[0]
して、等しいものがあった場合(0が返される場合).nonzero? ||
2番目の要素を基準に降順ソートb[1] <=> a[1]
と解釈することができます。
この例のように、言語に対する理解が深まることはあるのかなと思います。
エスパー力がつく
エスパーができるようになります。
エスパーというよりは、与えられた条件に対する最適解を導くまでの反射能力みたいなものがつくと思っています。
ロジカルに考えられるようになる(気がする)
アルゴリズムを解く時に一発で解けることもありますが、全てがそうではなく、段階的に解いていくことが多いと思います。
現状から目的達成までに何が必要で何をすべきかみたいなところの考え方が洗練されたように感じています。
コーディングテスト
Web系の企業では、インターンやエントリーの際にコーディングテストを課すところが多いです。
このコーディングテストでは、だいたいアルゴリズム系の問題が出題されます(たまにjavascriptの問題とかもある)。
実際にいくつか受けてみて、緑コーダーまで行けば、大体のコーディングテストは通るのかなと感じています。
逆に言えば、全くアルゴリズムを知らない状態だとかなり難しいのかなとも思います。
素晴らしいサイト達
終わりに
現在インターンをさせていただいていますが、今があるのは割とマジでAtcoderをやっていたからだと思っているのでめちゃくちゃおすすめです。
まずは1問解いてみましょう!