#はじめに
AtCoderで緑になりました。
AtCoder社の社長が出している色のレベル感についてこのサイトに載っています。
http://chokudai.hatenablog.com/entry/2019/02/11/155904
この感覚は人それぞれですが一般的に見ても緑になるまでに一年かかるのは遅いほうだと感じます。
自分としては一つの節目なので気持ちの良い間に形に残そうと、この記事を描きました。特に、AtCoderを知っているけど始めようか悩んでいる人、緑になるのがとても苦しい人に向けて自分の感じたことを伝えられたらと思います。
また、個人的にですが同じ色変系記事で特に参考になったものを挙げていきます。これらの記事の二番煎じになりますがご了承ください。
https://yosen.hatenablog.com/entry/2020/08/23/032208
https://qiita.com/nayuta9999/items/c97b835b31b07eac3a14
https://qiita.com/Kota-Y/items/396ab3c57830dad65cfb#comments
https://note.com/kirimin_chan/n/n889ec80b6fbc
軽く自己紹介をすると、情報系学部に通っている三年生です。プログラミング経験は大学に入ってからでAtCoderを始めるまではプログラミングを面白いと感じたことは滅多になかったです。言語はPythonを使用しました。
精進量(勉強)は AtCoder Problemsというとても便利なサイトを活用させていただきました。一つの指標として少し貼っていこうと思います。
#AtCoderを始めてよかったこと
AtCoderは同じ学部学科の友人たちに教えてもらい、今ではのめりこんでいるので感謝しています。始めてよかったなと感じたことを書いていきます。
###アルゴリズムや言語を学ぶ動機ができた
大学1,2年の間は「これ学んで何ができるの?」の観点でしか過ごしていなかったので大学の授業はもちろん受け身で単位のためにプログラミングをしていました。ですがコンテスト中に苦しんで苦しんで出した緑色のACを見て脳汁が溢れる瞬間、この瞬間のために不思議と知識を蓄えたくなりました。スポーツの試合なんかと似てますね。なので過去問などを解く際に必要な知識が出ると勉強しようという動機ができたので明らかに勉強の効率がよくなりました。
当時はProsessing、C言語くらいしか書いたことなかったですが、「AtCoderのレートを上げるため」にPythonの勉強をし、アルゴリズムの勉強をし始めました。
###友人などと一緒に学び、競いあえた
同じ大学の方達と競い合いました。週に一度のオンラインゲームをしている感覚なのでとても熱くなれました。競い合う上で、お互いわからないことがあったときに解説をしてもらったり教えたりと良い関係を築けるきっかけにもなりました。
周りの環境にすごく恵まれたと感じます。上記ではアルゴリズムの勉強を始めたと書いてありますが、基本的には友人や勉強会などを開催してくれる集まりの際に丁寧に教えて頂きました。
またtwitterを始めたことで強い方の考察や解き方を見ることで情報量がはるかに増えました。そこで新たに「この方に追いつきたい」などの闘争心が上がるきっかけにもなりました。
###自信がついた
まあ自信がついたといってもAtCoderを始める前よりはということなので自信があるのかといわれるとないです。緑になったという現状に満足をしたら甘いとは思いますが、いったん自分で自分をほめていいと感じるくらい自分には遠くてきつかったです。
しかしAtCoderをおすすめされて始めなかったらそもそもpythonは知らないし書く機会もなく、アルゴリズムって何?おいしいの?状態だったと思います(ネタ抜きで)。そういった観点で見ると自分のことをいったん褒められた時点でAtCoderを始めてよかったです。
###A,B問題の存在
AtCoderを楽しめるきっかけになった一つがこれではないかなと思います。競技プログラミングなんて天才達がやる遊びだ!というイメージを覆し、凡人の俺でも解ける問題を用意してくれて参加できるんだ!という人権をくれたようにも感じます。プログラミング始めたてでも標準入力と出力さえかければ解ける問題があるので、幅広い人が楽しく参加できるところが本当にいいところだと感じます。
#緑になるためにやったこと
###持っているアルゴリズム知識
- bit全探索
- 累積和
- 尺取り法
- imos法
- UnionFind
- 優先度付きキュー
- 二分探索
- 逆元
- BFS DFS
- DP(ナップサックまで)
ざっとこれくらいです。優先度付きキューくらいまではある程度使えますが、二分探索からはコンテスト中に出て解ける割合が3割ないくらいです。
###過去問を解く、解説を書く
とにかくたくさん解きました。そのうえで難しい問題などを解き終わった際に自分のコードに解説を書くように意識しました。めんどくさいですが思考の整理ができて後々助かることがよくあります。計算量の概念やひっかけ問題などになれるとコンテスト中でも余裕が出てくるのでそれを感じるのにそこまで時間はいらないかと思います。
###毎週コンテストの参加
土日のを予定組むときに遊びよりも優先していた時期が長いくらいほぼ毎週コンテストに参加しました。レートが下がるのが怖かったりモチベーションが出ないとき、全然精進していなくても、基本的に出た方がいいです。大体苦しい時期って下がって当たり前なんですよね。正常なメンタルがないときに上がる方が珍しいです。ですがそもそものレートが上がるチャンスや新たな知識が入るチャンスを自ら捨てる方が無駄だと思います。コンテストに出るだけでもある程度継続が続くのでその点でもおすすめします。
###必ず入力例を確認
コンテスト中に早く解こうとして簡単な問題の確認を怠り無駄なペナルティーを増やしてました。確認で少し遅れたとしてもせいぜい1分程度です。なんとなく違うなと感じたら自分で例と答えを作りました。最初のうちは入力例があってたらすぐ出してましたがやはりWAになるので、やたら条件分岐が多かったり計算量があいまいだったらすぐ出さずたくさん確認した方がむしろ効率は良くなります。
#なぜ一年もかかったか(緑になるために意識した方がいいと感じたこと)
自分の反省点とともにこのような点について気を付けてもらいたいという個人的な意見です。
###アウトプットが甘い
アルゴリズムを学んで一問解いてよーしできるようになった!!! そりゃできるようにならねーよなって話ですね。自分もよくこれをしているのでいまだにBFS,DFSが安定して実装できないのはここら辺の怠りです。一度解いた問題でも意外と解けなくなっているのでそれを自覚してもう一度取り組んだり、AtCoder Tagsを用いて類題に取り組めばより力が付きます。
###コンテスト中に解けなかった問題を後回しにする
コンテストでD問題やE問題を解けなかったとき「DPを使うのはわかってたんだよ」「幅優先探索を使うのはわかってたんだよ」とか言いながらコンテスト終わって解説見てもACしてない。正直ださいです。自分が一番わかっていながら今だに行動に移せていません。
コンテスト終了後は何時間も考え抜いて実装できなかった問題を学べる一番成長できる瞬間なのにそれを疎かにしていました。考え方がわかっても実装できなきゃ意味ないよと何度も教わりましたが甘えているので時間がかかるのも納得です。
###自分の中の緑の壁を大きくしすぎた
自分の中で緑になれるチャンスの際相当なプレッシャーを感じました。人それぞれ壁の基準は違いますが壁を越えたいという気持ちが強くなりすぎると、それは自分を苦しめる十字架にもなります。目標を立ててそれに向かって頑張ることはとてもえらいことですが、そこに焦りが生じると自分が嫌いになるので結果が出ないときでも自分だけは自分をほめて甘えたり逃げてもいいと思います。
###周りのレベルが高い
これは努力不足だろといわれたら何も返せませんが、AtCoderをしてる人たちは基本的にめちゃくちゃ頭がいいですしめちゃくちゃ努力してます。twitterをしていると頭いい人が多すぎるんです。なのでなかなかレートが上がらない人もある程度妥協をしないと心が沈む一方です。仕方ないと思うことがとても重要なので今つらい人はあまり思いつめず「すごいやつらと戦っている俺すごい」なんて考えられるようになってほしいです。
###問題文をよく見ない
解けないときに冷静になれない性格なのでよくこれで無駄にパフォーマンスを下げて周りにも迷惑をかけました。絶対実装できているのに間違っている。そんな状況が起きたら深呼吸して落ち着いてから問題文に書いてあることと制約の範囲などをよく見るよう心掛けるとより早くエラーに気づくかと思います。
#さいごに
最後まで読んでいただきありがとうございました。繰り返しますがAtCoderをやってよかったです。
勉強の機会を与えてくれたAtCoder社、それをサポートしてくれた便利なサイト、周りの友人や助けてくださった方、改めて本当にありがとうございました。