見出し画像

非情報系がAtCoderを始めてから1年ちょいが経ってどうなったか

はじめまして。はせがわといいます。
自分は、情報系の学科出身ではなく、電子制御工学科といういろんな分野をあーだこーだする学科に身を置いています。

去年の春ごろから競技プログラミング(競プロ)、AtCoderを初めて、2020/6月で大体1年と4カ月くらいになったと思います。
その振り返りをしていこうと思い、この記事を書きました。

競プロを知ったきっかけ

前にある通り、私は電子制御工学科の出身です。パソコンでカタカタしたいという気持ちがありながら、制御はいろんな分野を学べるよ!という謳い文句に乗ってこの学科に入りました。
そして月日はたち、2年終了。気づいたことは、
複数分野のお勉強ができるだけで、技能||実技はどの分野も何も身についてないということでした。
そんなとき、TwitterでAtCoderという文字を目にしました。もともと情報関係の何かしらがしたかった私にとってはうってつけの場所でした。当時の技術力は2年生の頃学んだC言語の基礎がわかる程度。ここから私のAtCoderもとい競プロもといプログラミング生活が始まりました。

それで結局今どうなのか

レートは887、解いた問題数は833問でした。

画像1

初めて1年ちょいでこれは、出来たほうなのか、微妙な方なのかは正直わかりません。

何をしたのか

そもそも
C++を勉強しました。C言語からC++に移った理由としては、
「みんなC++やってるから!」という単純なものでした。あとC++の方が便利そう、というのもありました。
とりあえず参考書を読んで雰囲気とある程度の基礎、書き方を知りました。
https://www.amazon.co.jp/dp/4797392592/ref=cm_sw_r_tw_dp_x_y108EbNE60P2Q
↑これを読んでました。

過去問解き
ある程度C++を勉強した後、実際に競プロの問題を解きました。
問題を解く方向性として、「自分がギリギリ解ける難易度の問題を解く」のようなものをよく見ますが、自分は「簡単な問題を大量にできるだけ解いて慣れる」ことを重視していました。
理由はなく、当たり前ですがそっちの方が楽だったからです。それから問題の難易度が上がるごとに、少しずつ、前者のような方向性を取り入れていきました。今考えれば、これのおかげで早解きがしやすくなったのかなと思います。

画像2

画像3

バチャコン参加
それから、AtCoder Problemsのあさかつやよるかつ(最近はくじかつ?)にもよく参加しました。灰Diffから青Diffまで幅広く問題を扱っているので、streakをつなぐのが億劫になっている時はこういうコンテストに出て意欲をかき立たせてました。(それでもLongest Streakは二週間でしたが…)

勉強した典型的アルゴリズム
少しずつ難しい問題を解いていくうちに、C++の基礎知識のみでは突破できない壁が見えてきました。それがアルゴリズムと呼ばれるものでした。
ただ現在の科学技術の発展のおかげか、沢山の巨人たちの記事を拝借しつつ、典型的アルゴリズムの何個かを覚え、簡単な問題なら解けるようになりました。覚えたものは以下の通りです。

・bit全探索
・深さ優先探索
・幅優先探索
・二部探索
・累積和
・しゃくとり法
・はやく素数判定するやつ
・はやくべき乗計算するやつ
・ダイクストラ法
・簡単な座標圧縮

もしかしたら他にもあるかもしれませんが、浮かぶのはこんな感じです。あと、C++はSTLというとても素晴らしい関数たちがいるので、それらも覚えました。その中でこれは覚えといて損はないな、というものを挙げます。

・swap, sort, reverse(配列あーだこーだするやつ)
・map, set, queue, priority_queue, pair(値を便利な形で保持してくれる系)
・lower_bound(二分探索とか)
・next_permutation(順列生成)

レートの減少がこわくなった話

1回戻ってもらうのは申し訳ないので、もう一度レートの画像を貼ります。

画像4

このレートの、10月末から1月中盤まで、一回もコンテストに出てないことがわかると思います。
この理由は至極簡単で、レートが下がるのが怖くなりました。対処法は簡単だと思っていました。AtCoderは競技であるし、レートの減少なんて気にせず楽しめばいい。
そう思っても、不安は拭えませんでした。せっかく情報系に、競プロに出てきて、積み上げてきた一本だけの柱が壊れるのが怖かったんだと思います。私にはそれ以外の取り柄がありませんでした。
茶色になれば、灰色になるのが怖い。せっかく上がったのにすべてを無に還すレート減少をしたくない。そう思ってました。

その思いが、あるコンテストで粉々に砕かれることになります。
そのコンテストの名は、パナソニックプログラミングコンテスト2020というコンテストでした。
私が解ける範囲での企業コンは、ある程度簡単な問題が多くそれでいてレートも上がりやすく、いわば自分にとっては都合の良いコンテストでした。その前のABCなども好調で、このコンテストでも良い成績が残せるだろうと思っていました。

とりあえず、結果を貼ります。

画像5

パフォは69、AtCoderを初めて最低パフォでした。レートは72の減少でした。これで思ったことはただ1つで、当たり前の事かもしれません。

レートは勉強した分だけ上がるかは定かではないが、勉強しなければ下がる。レートが下がったのなら勉強不足だから、もっと勉強しよう。

もう一度言いますが、見れば見るほど当たり前のことかなと思います。ただ、それまでの自分は考えすぎて、不安がこんがらがりすぎて、気づかなかったんだと思います。それ以降私は全くの不安がなくなったわけではありませんが、下がったなら勉強不足だ、もっと勉強しよう。という単純なスタンスが出来たのは確かです。

ふまえてAtCoderに対するスタンス、考え、似た境遇の人へ(非情報系から始める人など)

柱を増やす
競プロだけが取り柄というか、柱が一本だけだと折れた時に崩壊するので、他にも何かやっておくべきだと思いました。なんでもいいと思います。私は、PythonでDiscordのbotを作ったり、Processingでゲームを作ったりしてました。

基礎と柱、目的と手段を考える
これから情報系がなんにもわからず、かつAtCoderなどの競プロを始める人に対して思っておいて欲しいことです。これはあくまで私自身の考えなので、別に無視してもらっても構いません。大事なのは自分の勉強していることに対する意見をしっかり持つことです。

大事に思ってほしいのは、プログラミング(もといは数学)という基礎の上にAtCoder(競プロ)という柱が立っている。ということです。

周りの情報系に入りたての後輩が、プログラミングの勉強無しに、AtCoderに突撃してる様を見ました。正直それは、基礎を固めていない土台に柱をぶっ刺しに行っているようなものだと思います。

AtCoderを初めて少し経った人ならわかると思いますが、この世界は広く、AtCoderを始めたばっかりの人でも、中身が数学オリンピックメダリストであったり、有名企業のエンジニアだったりすると、一瞬で水色だったり青色に到達している様を見ることがあると思います。
なぜかというと、彼らには立派な基礎があるからです。盤石な基礎には盤石な柱が立ちます。

まずは、プログラミングを始める、慣れる、やってみることからだと思います。そのプログラミングの言語の楽しさだったり、その言語がどういうものかだったり、簡単なゲームを作ってみてから、その技術の腕試しとしてやってみるようなイメージでいいと思います。

目的と手段で考えるなら、AtCoderのためにプログラミングを学ぶのではなく、プログラミングを学んだうえでAtCoderをするということです。

あっ!数学要素を忘れていた!

最近、競プロで時々数学問題がでます。考え始めると難しいけど、数学で考えると簡単!みたいなやつです。
ただ、正直な話、それらに必要なのはだいたい高校の数学知識までだと思っています。ちゃんと数学の勉強、しよう…。
たまに、「競プロに数学の問題を出すな!」という人もいますが、それは違うと思っていて、そもそもプログラミングと数学は切っても切れない関係にあります。
競プロにしろゲームを作るにしろ、数学知識をプログラミングに使うときは必ず来ます。ましてやThe・情報系の道を進む人でAIであったり画像認識であったりだと、より高度な数学を用いると思いますし、情報系でなくても、力学系や回路系のシミュレーションをするのであれば数学の知識は必要になります。
であるので、さっき基礎と柱の話をしましたが、数学の基礎も作っておいて、その基礎を生かしてAtCoderやその他分野にプログラミングに活かすべきかな、と思います。

おわりに

長々と、非情報系民の話を聞いてくださりありがたい限りです。
これからAtCoderを始めるひと、情報系に入る人などに役立ってくれればいいなと思います。


この記事が気に入ったらサポートをしてみませんか?