#自己紹介
こんにちは、HIROSHI0635です。今は、金融関係で働く社会人2年目です(仕事でプログラミングは全くしませんOrz...)。大学時代は文系で、プログラムの「プ」も触ったこともなかったですが、競プロ始めて10ヶ月でなんとか緑になれましたので、やってみたかった「〜色になりました」の記事を書いてみました。自分語りの自己満記事ですが、AtCoder始めたてのPythonコーダーなら少しは役に立つことが書いているかもしれません。
#1.AtCoder始めるまで
始めた動機は、今の仕事に向いてないなと思って本当に辞めようかと迷ってた時、じゃあ次は技術力で勝負できる仕事がいいなと思って、「今からでもやれるもの」という発想でプログラミングに行き着きました。ただ、プログラミングの「プ」もわからない状態で、何か作りたいものもなかったので、どうしようかと迷っていた時に、大学時代の先輩が薦めてくれたのが、AtCoderでした。受験勉強はまあまあ得意だったので(とはいえセンター数学はIAもⅡBも80点くらいのレベル)、問題を解いてレートが上下するというのは自分に合っている勉強方法だと思いました。
#2.挫折
最初の言語は、何も分からなかったので薦められるがままに、AtCoderで一番メジャーなC++にしました。ただ、文法がややこしく、いわゆる「おまじない」のようなルールが多くなかなか問題を解くところまで至れませんでした。半年くらい何もしない期間が続きます。
#3.復活まで
たまたま、仕事先でエンジニアのお客様と接する機会があり、C++で競技プログラミングに挫折したことを話すと、「それなら、Pythonでもう一回やってみれば?。おまじないも少ないし、やりやすいと思うよ。」趣味のサイクリングも毎週行くほどの気力もなくなってきて暇だったので、もう一度再開しました。今回は、文法で挫折しないよう、PaizaでPythonの講座を一通りやってから、問題を解きはじめました。ただ、巨大なプログラムを書くならクラス、インスタンスまでやる必要があるのかもしれませんが、Atcoderなら関数くらいまでやれば十分なので、あとはひたすら問題を解くのがいいと思います。C++で挫折した方がいれば、騙されたと思ってPythonでもう一度やってみるといいと思います。
何やら環境構築がめんどくさそうで、また挫折するのも馬鹿らしかったので、緑になる直前までpaizaのオンライン環境でコードを書いていましたhttps://paiza.io/ja
茶色になるまでは、まずひたすらB問題埋めをやりました。最初は時間がかかっていたのですが、慣れれば解法はほとんどノータイムで浮かんであとは実装するだけって感じになりました。B問題を1ヶ月で50問くらい埋めて、もう書くだけって状態にしました。次に、「蟻本はよい。」という噂を聞きつけ、ただ今更買うのもあれだったので、AtCoder 版!蟻本 (初級編)を埋め始めました。全探索とか、貪欲とかは割と理解できたのですが、DFS、BFSで完全に詰まってしまい一旦諦めてC問題を埋め始め、そうこうしているうちに茶色になっていました。
茶色から緑は難なくいけるだろうと思っていましたが、意外と苦戦しました(現に、茶色に上がる最後のコンテストでは、パフォーマンス1000を超え、時間の問題と思っていました)。というのも、2019/10頃から、明らかに周りのレベルが上がり、以前より150くらいパフォーマンスが下振れするようになりました。また、時々簡単な問題に手間取り、パフォーマンス400程度を出すことがあり、レートを足踏みさせてました。
そこで、自分なりに考えたのが、難しい問題を解くのが「攻撃力」なら、簡単な問題を速く解くのは「守備力」で、攻撃力をあげるのは難しいから、まず守備力をあげようとしました。
また、最近の問題傾向として、C問題の易化が進み、茶色Difficulty(AtcoderProblemでのDifficulty400〜800の問題)を飛ばして、いきなり緑・水色のDifficultyの問題が出ることが多いです。(ABC140からABC156において、茶色Difficultyは5問に対し、緑Difficulty11問、水色Difficulty13問)。茶色問題が出ないセットも多くあり、緑問題を解けるレベルにないなら、灰色問題の速度をあげることが、緑への早道です。
守備力をあげるには、たくさん精進するしかないですが、それ以外のところでやってみたことを挙げてみます。
##ローカル環境の導入
長らく、Paizaのオンライン環境のお世話になっていましたが、意を決してローカル環境を構築しました。同時にAtcoderユニットテスト を導入し、A問題・B問題の動作確認を大幅に改善させました。やはり、ローカル環境の方が予測入力やテンプレートとかバグの発見とかでメリットありまくりなので、出来るだけ早くローカル環境に移る方がいいと思います(まだ全然使いこなせてない)。ちなみに、Pycharmを使っています。
##問題を読み込まずサンプルを早く見る
C問題くらいまでは、問題文は理解できなくても軽く流し読みして、サンプルを見た方が早く問題の全体像が掴めることが多いです。D以降は制約をよく読まないとひっかけられることも多いので、よく読んだ方がいいです。
##バーチャルコンテストの活用
コンテストの間隔が開くと速度もモチベーションも下がるので、定期的に仲間内でバーチャルコンテストを開いて速度の向上とモチベーションの維持に努めました。
失敗してもなんとかコンテストに出続け、緑になることができました。
#6.その他Python戦士に有益なtips
##Collection.Counter、most_common()メソッド
このライブラリーは本当に応用範囲が広いです。
使い方はこの記事。https://note.nkmk.me/python-collections-counter/
5回に1回くらいは、これを知ってれば瞬殺できる問題が出てきます。
##入力が少し速くなるおまじない
import sys
input = sys.stdin.readline
一番最初にこの2行を足すだけで、1割くらい速度が上がります。
理由はよくわかりません。
細かい速度改善に関することはこの記事がわかりやすいです。
https://www.kumilog.net/entry/python-speed-comp
#7.終わりに
今回は、半分競プロをやるようになった流れがメインでしたが、水色になれたら、もう少し問題を解くのに役立つまとまった記事を書きたいと思います。