AtCoder緑色になりました(色変記事)
(この記事は僕がAtCoderで緑色になった直後に書いた記事の再掲です。)
この記事では、僕がAtCoderで緑になるためにどんな勉強をしたかをまとめたいと思います。
前半部分では、自己紹介やAtCoderを始めた動機について書いているので、興味がない人は適当に読み飛ばしてください。
自己紹介
工学部の大学2年生です。(達成した当時)
競プロをやっている人の多くは、もともとプログラミングができたり、中学・高校の頃からパソコンを使うことに慣れていたという人が多い印象です。
そんななかで、僕はプログラミングはほぼ未経験、自分のパソコンを持ったのも大学に入ってからという状態で競技プログラミングを始めました。なので、同じような境遇の方の参考になると思います。
Atcoderを始めた動機
ここからは、AtCoderを始めるに至った経緯を時期別にまとめたいと思います。
高校時代
自己紹介でも書いたように、高校時代の自分はプログラミングのことなんてほとんど知りませんでした。
今思えば笑えますが、「プログラミングって0と1で表すんでしょ?」と本気で思っていました。
そんなプログラミングのことなんて何も知らない高校生でしたが、情報系の分野への憧れはこのころからありました。
大学一年生
自分のパソコンを持ち、レポートを作成することに主に使っていました。プログラミングには興味があったものの、パソコンを触るのが怖くて自分から手を出すことはありませんでした。
そんななか前期の授業でPythonを習いました。
しかし絶望的にわかりにくく、ほとんど理解できませんでした。
そこで、夏休みに復習をしようと思いProgateの無料プランでPythonの勉強をしました。
この段階で、書いていたプログラムは本当に簡単なもので
入力、出力 [input(), print()]
条件分岐 [if , else]
四則演算 [+, -, *, /]
ループが少しできる。 [for, while(break, continueはよくわからない。)]
このぐらいのレベルでした。何が楽しかったのかはわかりませんが、気が向いたらプログラミングの勉強をしていました。
しかし、なぜか9月以降の半年間は、ほとんどプログラミングをしませんでした。
大学二年生・春
前期に再びプログラミングの授業がありました。
この授業も基礎的な文法からの勉強でしたが、Progateで復習していたおかげでついていくことができました。AtCoderを初めて知ったのもこの授業でした。
この授業でプログラミングの演習をしているうちにプログラミングが好きになりました。
そこで、授業で聞いたAtCoderのことを思い出し、始めてみることにしました。
このころが5月で、コンテストには出ずに過去の問題を解いていました。この時に解いていた問題は、主にABCのA問題とB問題です。
大学二年生・夏
そろそろコンテストに出てもそれなりに解けるだろうと思い、七月の末に初めてABCに参加しました。
このときの結果は、3完でパフォーマンスは200台でした。最初にしてはまずまずの結果だったと思います。
ここまで読んでもらって分かるようにAtCoderを始めたころの私はほとんど知識もない状態でした。
そんな僕が7月にAtCoderを始めてから12月に緑コーダーになるまでにしたことを紹介していきたいと思います。
緑色になるまでにやったこと
ここから、本格的にAtCoder をやり始めてから(夏以降)やったことをまとめます。
AtCoder Problemで過去問を解く
まず、AtCoder Problemを使って過去問を解きました。それまでも使っていましたが、このころからC問題以上を中心に解いています。
自分はABCのA問題、B問題を全部解きましたが、その必要は全くありません。
この難易度の問題は基本的な文法さえ分かっていれば解くことができるのでる、スラスラ解ける人はそれ以上解く必要はありません。
もし、この問題でつまづくという人は、文法を覚えているかの確認、A問題,B問題を解いて実装の練習をしてください。
ちなみに、競技プログラミングで用いられる言語として最も主流なのはC++ですが、初心者の方には覚えやすく、実装が簡単なPythonをオススメします。(Pythonには実効時間が遅いという弱点がありますが、緑色になるまでには影響しないので安心してください。)
次にABCのC問題以上は、アルゴリズムを知らないと解けない問題が多くあるため、分からないと思ったら解説を見るようにしていました。とはいっても、すぐに解説を見るようでは力がつかないので数十分は考えてから解説を見るようにしましょう。
そうすることで、その問題がどのような問題かを深く知ることができ、解説を見たときに理解しやすいと思います。また、次に似たような問題を見たときに解けるようになります。
このような方法で勉強をしていくうちに、解いた問題が次のような3種類の問題に分類できると思います。
1.知らないアルゴリズムを使っていた問題
2.アルゴリズムは知っていたけど、それを使うと気づけなかった問題
3.どのアルゴリズムを使えばよいかまでは分かったが、実装できなかった問題
まず、1に当たる問題に出会ったときは、解けなくても仕方がないと思います。
しかし、復習をよくして次からは使えるようにしましょう。
また、緑になるために知っておく必要があるアルゴリズムは数個しかないので、確実に使えるようにしておきましょう。
リンク
「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」では、基本的なアルゴリズムから少し難しいものまで幅広くまとめられています。
緑コーダーになるためにこの本をすべて理解する必要はありませんが、知らないアルゴリズムに出会ったときなどに辞書代わりに使えると思います。学習効率が上がるのでオススメです。
次に、2に当たる問題に出会ったときは、単純に経験不足だと考えられます。
なぜそのアルゴリズムを使うのかということを噛み砕いて理解したり、典型的な問題を覚えたりする必要があります。
最後に、3に当たる問題と出会ったときは実装力が足りてないので、同じ問題を何回か解いてみたり、似たような問題を解くことで実装力を鍛えましょう。
また、紙に書いて確認しながらプログラムを書くと、頭が整理されるのでおすすめです。
リンク
Twitterで自分より遥かに強い人&自分より一つか二つ上の色の人をフォローする
これは、一見関係ないことのように思えますが、勉強を進めていく上でとても重要なことになります。
自分より遥かに強い人をフォローすると、いつかその人のようになりたいとモチベーションを保つことができます。
また、初心者が何をしたらいいかなどを言及してくれることがあるというのも理由の1つです。誰をフォローすればいいかわからない人はとりあえずAtCoder社長のchokudaiさんだけはフォローしておきましょう。
次に、自分より少し上の人をフォローするのは、勉強するべきことを明確にするためです。
その人ができて自分ができないことがその色になるために必要なことです。
競技プログラミングはできて間もないので、強い人が始めたころと今では大きく状況が変わっています。
そのため、最近始めた自分より少し強い人の意見のほうが役に立つことがあるので、ぜひフォローしておきましょう。
アルゴリズムの勉強をする
上でも述べたようにアルゴリズムの勉強をすることは、解ける問題の幅を広げることになります
アルゴリズムとは、簡単に言うと問題の解き方のことを言います。アルゴリズムとは何かについて詳しく知りたい人は調べてみてください。
大抵の問題は、めちゃくちゃ非効率な方法でもよければ解法が思いつきます(全探索など)。
ただし、AtCoderをはじめとしたプログラミングコンテストでは実効時間の制限があるので、そのようなプログラムではACすることができません。そこで、アルゴリズムの知識を使います。
ただ、緑になるためにはそこまで多くのアルゴリズムを覚える必要はありません。以下に緑コーダの自分が使えるアルゴリズムをあげておきます。
このあたりの知識があれば、十分だと思います。
速く、正確なプログラムを提出する
最初のうちはABCのC問題ぐらいまでしか解けないと思うので、ACまでの速さも重要になってきます。
しかし、焦って誤ったコードを提出してしまっては本末転倒です。なので確認をしてから提出したほうがいいです。
AtCoderではテストケースが与えられるので、正しい出力が得られることを確認しましょう。
次に、与えられる入力の上限を確認します。テストケースでは、小さめな値しか与えられないことが多いため、大きな値の入力で間に合うかを確認する必要があります。
また、入力の下限(0、1など)でバグを起こすプログラムを書いていることがよくあるので、そのときにも使えるプログラムになっているか確認しておきましょう。
終わりに
初投稿のため分かりにくい部分も多かったと思いますが、いかがだったでしょうか?
この記事を読んで、AtCoderを始める方がいらっしゃったら幸いです。
そして、始めたからには緑コーダーになるまで精進していただきたいと思います。というのも、茶色コーダーでやめてしまっては競技プログラミングの面白さを知るには十分でないし、学べることも少ないです。
緑コーダーになることはそれほど大変でもなく多くのことを学べるので、とりあえず緑コーダーになるまでは頑張っていただきたいと思います。
最後に私の次の目標を3月までに水色コーダーになる!と設定させていただきたいと思います。3月にまた、色変記事が書けるといいなと思います。
ありがとうございました。