はじめに
ABC241にて入緑させていただきました。今まで多くの人の勉強法の記事に助けられて今の自分があると思うので、今度は自分が恩返しする番だと思い記事を投稿させていただきます。初投稿にて、見苦しい点もあるかと思いますが、ご容赦ください_(;ω;`」_)
自己紹介
2019年3月に国公立大学医学部卒業
2022年2月現在 医師として3年目
数学や物理などの自然科学分野は相当得意な学生時代だったと思います。センター試験も全教科合計94%程度だったので、世間の中ではいわゆる頭の良い方だったのだと思います。
プログラミングの知識は...
全くのゼロでした。そもそも、どんな言語が存在するのかすら知らない状態が2021年9月の段階です。今回は、そこから5ヶ月で入緑した過程などをお話できればと思います。
プログラミングを始めたきっかけ
特に自分でアプリが作りたいだとか、ホームページ作成がしたいだとか、そういう動機は一切ありませんでした。強いて言えば、義務教育におけるプログラミングが始まるということで、将来子供に「お父さんこんなことも分からないの〜」と言われたくなかったからですね(笑)現在28歳独身で結婚予定すらございませんが...
Pythonを選択した理由としては、「今、Pythonの人気が高まっている!」といった趣旨の記事やニュースをよく見ていたのと、シンプルにヘビ(~>~~~)のアイコンが可愛いなと思ったからです。(爬虫類大好き)
学習過程
Progate
まず一番最初に取り組んだのがこれです。プログラミングとは何をすることかすらよくわかっていなかったので、本当に基礎の基礎からはじめました。「printで出力するのか」「リストという構造があるのか」「先頭は1からじゃなくて0から始まるんだね」というレベルです。これらの基礎の基礎学習に大体2週間ほど費やしました。レッスンの集大成として、ロボット相手にじゃんけんをするプログラムを作成するのですが、自分が書いたコードがちゃんとじゃんけんできるように動いてくれたのがとても嬉しく、完成してから1時間ほどはそのプログラム相手にじゃんけんをし続けていました。(笑)
問題はここからです。もともと「何かを作りたい」という動機があった訳でもなくプログラミングをはじめたので、ProgateでPythonの基礎を1通り学習してしまったあと、「次に何をしよう?」という問題に直面してしまったわけです。
さすがにここで学習をやめたら、あまりにも中途半端というか、三日坊主というか。何かモチベーションの持続につながるものはないかといろいろ調べていた結果、競技プログラミングというものに出会いました。試しにちょっと解いてみると、これはもうめちゃくちゃ面白くて、すぐにドハマリしました。自分が書いたプログラムが正常に作動してACを貰えるという快感は、先に述べたじゃんけんプログラムが正しく動いたときのような気持ちよさがあり、ここで「よし、次は競技プログラミングを頑張ってみよう」と決意しました。
AtCoder 凡人が『緑』になるための精選50問詳細解説
次に取り組んだのがこれです(2021年9月15日購入)。はい、完全に無理でした(´+ω+`)当時はまだレーティング0です。いくら著者の佐野さんが懇切丁寧に解説してくださっているとはいえ、灰0の者に理解できるのは最初の1,2問目までが限界でした。
この本を購入して3日後に、初めてのABCに出場します。ABC219で、30分かけてネットやこの本でわからないことを調べながら解いて2完しました。
もっと難易度が低い本に切り替えればよかったのですが、これは自分の悪い癖というか、一度始めたら途中で投げ出すことが許せないんですね。学生時代も、一度参考書を買ったらそれを少なくとも1周するまでは次の参考書を買わなかった時から変わっていませんでした。ということで、結局この本をやりきります。全部で50問収録されているのですが、今思えばどれも汎用性の高い知識、テクニックが学べる素晴らしい問題だったと思います。
結論から言えば、このスパルタ式がよかったのか、7回目の参加となるABC226で入茶しました。プログラミングを初めて2ヶ月、ABCに参加してから1ヶ月半での出来事でした。
AtCoder Problems
上記の本を読み終えたあとはひたすら問題演習に移行しました。AtCoderの過去問がまとめられており、難易度も表記されているのでとても使いやすかったです。
上記の図は、入緑した翌日の状態です。A問題は正直言って全部解く必要はまったくないと思います。私の場合、早解きの練習として1日1個A問題を解く(問題を見てから30秒以内ACが目標)みたいな練習方法に使っています。
BとCはすべて解くことをオススメします。入茶、入緑のカギとなるのは、如何にB,C問題を無難に解けるかにかかっています。大体B,Cの過去問の半分を解いたあたりで入茶、全て解き終わって入緑のような成長でした。D問題に関しては、入茶するにあたっては解けるに越したことはないですが、まずはB,Cまでいかに正確に早く解くかのほうがよっぽど重要であるため、優先度はそこまで高くないです。初めてABC出場してから入茶するまでの7回のうち、D問題が解けた割合は14%。入茶してから入緑するまでの14回のうち、D問題が解けた割合は50%でした。入茶するのにD問題を解く必要性が低いことがよくわかります。逆に、入緑する上では2回に1回はD問題を解く必要性があると言えるでしょう。
また、私は解いているときに10分考えてさっぱりであれば、躊躇なく解説AC、それも厳しければ写経ACすらしていました。正直、考えても分からないものは分からないですし、知らないものは絶対に思い浮かびません。それだったら、さっさと答えを知ってそれを今後に利用していったほうが断然効率がいいです⸜( •⌄• )⸝
問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本
2021年年末にこの本が発売され話題となっていたので購入しました。この本こそ私が灰色だったときに読まなきゃいけなかった本だと思いました。著者のE8さん自身が仰っているように難易度は全然高くないです。競技プログラミングを知っている人ならだれでも聞いたことある、知っている有名アルゴリズムに関して、数学的背景を踏まえながら優しく解説してくれる本です。灰色の方が入茶を目指すのにこれ以上ない丁寧な解説です。茶色以上の方ですと、この本を読んで新しく学ぶ知識やテクニックはほとんどないと思います(そもそもそういう本ではないですし)。ただ、既に知っている、何気なく使っていたアルゴリズムの根底にある数学的背景を学ぶことで、自分にとってはかなりプラスとなりました。
これから0から競技プログラミングを始める方へ
上記の私の学習過程を踏まえた上で提案させていただく入茶、入緑への最も効率良いと思う方法は、問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本をまず読む。中に書いてある問題演習も頑張って解く。それと同時並行くらいでAtCoder ProblemsのB,C問題をとき始めると、2ヶ月くらい経過した頃には入茶できます。問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本を読み終えたあとは満を持してAtCoder 凡人が『緑』になるための精選50問詳細解説を始めてください。B,Cがだいぶ解けるようになればD問題にも手を出し始めましょう。あとはひたすら問題演習ですᕙ( ˙꒳˙ )ᕗ
その他、伝えたいこと
早解きは死ぬほど大事
ABC236がとても印象的でした。この回は、A,B,C問題がdiff100以下でD問題がdiff1190とかいうとんでもない回でした。A,B,C問題まで5分52秒で解いて、残りの95分間はD問題とにらめっこして終わりました。「パフォーマンス700くらいかな」と思っていたのですが、なんとまさかのパフォーマンス1101(マジ?)この回は先述の通りCとDの難易度にあまりにギャップが有りすぎたため、ほとんどの人がC問題までの3完止まりでした。そうなると大事なのは解いた早さです。私は3完5分台でパフォ1101でしたが、これが10分で解いたとなるとパフォ800台まで落ちます。20分だと500程度しかパフォーマンスがもらえません。°(°´ᯅ`°)°。
どうしても相性が悪い回はある
コンテスト中、順位表みてると他の人がどんどんACしている中、自分は解き方すら思い浮かばなかったり、提出はしたけどどうもコーナーケースでWAとなるみたいな回は絶対にあります。そういうときは更に焦りが生まれてしまい、たいてい爆死します。私もありました。絶好調で「そろそろ入緑か?」と思っていたレーティング700台だった頃、突如パフォーマンス356を出してしまいレートがかなり溶けました。後で解説読んでみると「なんでそんな単純なことが思い浮かばなかったんだ」という自分自身に対しての怒りが湧いたりします。でも、そんなことは絶対いつか起こります。むしろすべての回で自分のベストを尽くせたなんてのはありえないと思ったほうが逆に気が楽になります。心配いりません、受験と違って年に1回なんてことはなく、来週にはすぐリベンジできますから٩( 'ω' )و ガンバルぞい
最後に
ここまでつたない文章をお読みいただきありがとうございました。私がQiitaの記事に多々助けられたように、この記事がどなたかの学習の一助となれば幸いです。