はじめに
競技プログラミング(AtCoder)を再開してほぼ一年が経ちました。挫折して再開から現在までを振り返って、一年間競技プログラミングを続けて良かったと思ったことについてまとめます。
最初に、再開時のスペックと現在についてです。
初期スペック
- 学部4年
- スキル
- C言語
- 基礎的な知識あり
嫌い
- Python
- 機械学習の授業で使用
- 大昔に競プロで使っていた
- 好き
- アルゴリズム
- 授業で座学として学ぶ
- なお「dfs?bfs?何それ美味しいの?」状態
- 授業で座学として学ぶ
- C言語
現在
- 修士1年
- スキル
- C言語
- 嫌い
- Python
- 研究で大活躍
- 大好き
- アルゴリズム
- (ABCのD問題ぐらいまでの)主要なものは大体わかるしかける(と信じている)
- bfs好きのdfsアンチです
- (ABCのD問題ぐらいまでの)主要なものは大体わかるしかける(と信じている)
- C言語
- 実績
- AtCoder Algo水色
- Code QUEEN 2024 決勝進出
挫折から再開編
大昔の競プロ
実は、AtCoderは大学入学してすぐに触れていました。当時はコロナ禍で暇も多く、最初のうちは意識も高かったのでPythonの勉強のために競プロをやっていました。しかし、大学の授業が本格化し、土曜日にバイトも始まりで、勉強頻度は激減。とりあえず出ていたコンテストも、入茶目前にしてレートが急降下し、コンテストにすら出なくなりました。また一年後、再開するもレートが上がるはずもなく、AtCoderは記憶の彼方に追いやられてしまいました。
まあ、こんなグラフしてたらやりたくなくなるよねw
再開のきっかけ
こんな私がまた戻ってきたのは学部4年の頃。主なきっかけは以下の三つでした。
- 時間に余裕ができた
- 研究が始まる前にPythonをある程度使えないといけない
- 就活のコーディングテストがやばい
私の学部はかなり多忙な部類に入るところだったので、学部3年までは正直大学のことで手一杯でした。4年生で研究室に配属され、研究内容もある程度固まった頃、研究データの分析がExcelゴニョゴニョではどうにもならないことを悟り、なんとかしなければ...!!状態に。この時私が一番問題視していたのは、「プログラミングをする習慣がない」ことだったので、競プロは最適だと思いました。
また、4年春頃気になっていた企業のインターンに申し込んだところ、見事にコーディングテストで打ちのめされたので、就活もこのままではまずいと危機感を覚えました。
こういった理由から無事に競プロを再開することができました。
再開後編
また挫折しなかった...?
多くの人が疑問に思ったことではないでしょうか?(笑)結論から言うと、挫折しませんでした!!振り返ってみて、これには明確な理由が2つあると思っています。
- ABCには何としてでも出た
- 同レベルで競プロを頑張っている人に出会えた
前述した通り、競プロは「プログラミングをする習慣」を得るために始めたので、どれほど忙しくても予定がない限りは必ずRatedで出ました。実験?卒論?関係ないです(笑)精進できていなくてもとにかく参加しました。実際、ABC321から364まで不参加は二回のみで、我ながらよくやったなと思います。(実はこの記事が出る直前二回(ABC365, 366)は出られていないのですが、精進はしてるので許して!!)
また、大学の友達を競プロに誘い込み、一緒に勉強できたことも大きかったと思います。ABCの感想や復習、アルゴリズムの教え合いがリアルでできる環境だったので、モチベーションもかなり上がりました。ネット上でも競プロ垢を作り、日々刺激を受けていました。
良かったこと
再開して一年で変わったこと・良くなったことをまとめていきます。
コーディングが早くなった
再開当時はABCのCまでを30分で解ければ良い方でしたが、今では15分ほどになりました。解法が浮かぶスピードも早くなりましたが、単純なコード(for文など)を脳死で書けるようになったことも大きいと思います。
コードが綺麗になった
ちょうど競プロ再開前に提出されたコードがあったので、今の私が書いてみました。
ABC283 C-Cash Register
N = int(input())
N_list = [int(x) for x in list(str(N))]
next = N
count = 0
flag = 0
for i in range(len(N_list)):
amari = N_list[-(i+1)]
if amari != 0:
count += 1
if flag == 1:
count += 1
flag = 0
elif amari == 0 and flag == 1:
count += 1
flag = 0
else:
flag = 1
print(count)
s = list(input())
cnt = 0
i = 0
while i < len(s):
if i == len(s) - 1:
cnt += 1
i += 1
elif s[i] == '0' and s[i+1] == '0':
cnt += 1
i += 2
else:
cnt += 1
i += 1
print(cnt)
beforeよりafterの方が少ない変数で読みやすく、かつ何がしたいかが伝わりやすいと思います。競プロではあまり可読性は重視されませんが、私の中では「簡潔に書く=ミスが少ない」につながったので、よく他の方のACコードを読んでいました。
研究のプログラムで困ることはなかった
私の研究では、あまりアルゴリズムを重視して書くようなものはありませんが、listやdictなどの便利機能を競プロを通じて学んでいたので、その場に応じて書きやすいコードを見つけるのが早くなりました。あとindexの扱いもかなり競プロで鍛えられたと思います。競プロをやってなかったら、今頃はデータによってREだらけのプログラムに頭を抱えてた気がします...
就活のコーディングテストはほぼ通過した
サマーインターンの選考にあたり、コーディングテストは何社も受けましたが、ほとんど通りました。落ちた企業も別要素(エントリーシートとかスキル要件とか)での落ちの可能性が高く、「就活のために競プロを始めた」とすれば大成功の結果となりました。(職種により異なる可能性もあるので悪しからず)
[参考]
ちなみに、よくある「AtCoder◯色なら就活が余裕ですか?」の質問に対して、答えは「No」だと感じました。青以上についてはもちろんわからないですが、少なくとも私が受けていた企業の中で「AtCoderが水色である」ことを理由に合否が定まったと感じた企業はありませんでした。もちろんAtCoderの上位層が他分野においても優れている傾向があることを考慮すれば、最初の質問のような結論に結びつくのでしょうが、因果関係を間違ってはいけないですね。世間はあまりAtCoderの(各色の)価値を分かっていないのが現状だと思います。
新たなコミュニティに入れた
情報系の女性あるあるですが、基本的に同じ趣味を持った同性には出会えません。大学によってはそもそも一学年に女性が一人しかいないなんてこともあります。なので、オンサイトのCodeQUEENに出場し、女性競プロerにたくさん出会えたことは単純に嬉しかったです。そこで新たに知り合った人と二次会に行ったり、一年後また会おうと約束したりする時間はあまりにも新鮮で眩しかったです。
まとめ
いかがでしたでしょうか?最後に私のAtCoderレートグラフを晒しておきます。なかなか見かけないグラフなんじゃないかなと思います笑
何度も挫折しましたが、今では「なぜもっと早く再開しなかったんだ!!」と思うぐらい役に立ってます。この記事を読んだ方が何かを掴むきっかけになれば嬉しいです。