#概要
2021/01/28からPythonでAtCoderを始め、AtCoder Beginner Contest(通称ABC)に参加し、2021/02/27のコンテスト(ABC 193)で茶色になりました。プログラミング経験はほぼゼロの状態からスタートしました。
自分の勉強の振り返りだけでなく、AtCoderの始め方や過去問サイトも紹介しています。
途中で登録の仕方や過去問サイトを紹介していますので、ぜひ記事を読みながらAtCoderを始めてみてください。
プログラミングのことを何も知らない人でもこの記事を読んだらAtCoderを始められるように書いたつもりです。
私はPythonを使っていますが、コードは出てこないので他の言語を使う方でも差し支えなくお読みいただけます。(他の言語の特有の難しさについては分かりませんのでその点はご留意ください)
厳しいことや難しいことは言ったりしないので安心して読んでください。
※説明不足な点がありましたら教えていただけると幸いです。
#目次
- とりあえずAtCoderに登録しよう!
- 本当に初心者です
- AtCoderを始めたきっかけ
- Pythonを選んだ理由
- 茶色になるまでに勉強したこと
- モチベーション管理
- 茶色になった感想(どれくらい大変だったか)
- これから競技プログラミングを始めるみなさんへ
- まとめ
- 参考
#とりあえずAtCoderに登録しよう!
AtCoderのコンテストでは数学的なパズルのような問題を解きます。無料で参加することができます。問題を解くといっても匿名でできますし、採点はコンピュータがするので気軽に参加できます。
少しでも興味があるあなたは公式ページに行き、右上から登録してしまいましょう。誇張抜きに2分で登録できます。
また、コンテストの過去問はAtCoder Problemsというサイトにまとまっています。このサイトにはユーザーID(AtCoderの登録名)を入力して自分の学習状況を確認できる機能があります。
でもパソコンにPython入ってないし…という方も大丈夫です!過去問の画面からコードテストをのページを開くと、そこにコードを書いて正しく動くか確認することができます。Python以外にも様々なプログラミング言語を使うことができるので、ちょっとAtCoderやってみたいなって人も気軽に始めることができます。デバッグの環境を整えている方も多いようですが、コードテストでもしばらくは十分戦えると思います。ローカルのデバッグ環境を作りたい方は調べてみると構築の仕方の記事が出てきます。
私も茶色になった現在までコードテストしか使っていません。
AtCoderは気軽にできることがおわかりいただけたと思います。
#本当に初心者です
こういった記事をシェアするにあたって、執筆者が競技プログラミングで求められるスキルをどれだけ持っているかは重要だと思うので少し自己紹介をさせてもらいます。
####①私のプログラミングスキルについて
ほぼ未経験です。
大学の講義でRを使う機会は何度かありましたが、ネットや参考書のコードをコピペするだけだったのでRのコードは書けないどころか読むこともできません。アルゴリズムに関しては「ダイクストラ」って言葉だけ聞いたことがありました。
AtCoderを始める25日くらい前にPythonの入門サイトで使い方を読みましたがただまとめを作っただけで何もできるようにならず、AtCoderを始めた段階で何一つできない状態でした。
初心者の記事といってもプログラミング経験がある方がほとんどですが、私の場合は本当に何も分からない状態から始めました。
####②数学力
AtCoderでは数学パズル的な問題を解くので数学的な思考力も求められます。初心者向けの問題で数学の高度な知識が求められるわけではないので安心してください(最初は割り算の余りとか図形の面積とかのレベルです)。
競技プログラミングを趣味にしている人たちと比べると間違いなく数学力は低いです。高校の全国模試とかでいうと文系の中で上位2割くらいだったと思います。
ただ、数学に限らずテストに関しては、私は慣れればある程度スムーズに解けるけど、慣れないと簡単な問題も解けないタイプでした。
要するに初めて見る形式の問題への対応力や柔軟な発想力がないんだと思います。
上記の理由から数学力の面から見た私の競技プログラミング適性は低めだと思っています。
※数学がすごく苦手な方はきりみんちゃんノートが参考になるかと思います。きりみんちゃんさんはYouTubeでも活動されているので一度覗いてみると競技プログラミングの問題を解く雰囲気が分かると思います。
#AtCoderを始めたきっかけ
漠然とプログラミングやってみたと思っていたのですが、難しそうだしやりたいことも見つからないしで始められずにいました。そんなときにAtCoderの存在を知り、簡単に始められて基本的なコードの書き方を覚えられそうだったのでやってみることにしました。それで自信が付いたら色んなことにチャレンジしてみようって感じです。
始める前に茶色や緑になるまでの振り返りの記事をいくつも見たのですが、「茶色になるのは意外と大変!」「思ったより時間がかかった…」といった記事が多く、ビビっていました。
始める際に、とりあえず1カ月間はプログラミングの勉強に関してはAtCoderに集中して茶色になることを目標としました。
#Pythonを選んだ理由
比較的楽そうだからです。
C++の方が計算が早いから有利って記事も見たのですが、Pythonで上の方のレートまで行ってる人も結構いるし、初心者はどの言語を使っても大差ないだろうなと思ったのでPythonにしました。
あとはPythonだと機械学習ができたりネット上の情報を集めて分析したりできそうだなあって本屋さんで参考書を眺めて思ったからです。
正直ほかの言語のことは知りません。
ここまでで私があほなのが伝わったと思います。
こんなんでも茶色になれます。
#茶色になるまでに勉強したこと
私自身の振り返りとしても書きますので記事が少し冗長になってしまいました。
私の体験記ではありますが、お読みいただければみなさんが0からステップアップしていくイメージがつかめると思います。
また、C問題が解けるようになるまでに必要なことも大体分かると思います。
毎回次のコンテストまでにすることを決めて勉強していました。おおむね予定通りに進みました。
参考にした資料はすべてほかのプレイヤーさんがネット上に公開してくださっているものを利用し、問題演習はABCの過去問しかやっていません。
####①1回目のコンテストまで
AtCoderに登録したのは1月末なのですが、正月あたりにPythonの基礎をこちらのサイトで勉強しました。勉強したといっても自分で手を動かしたりはせず、まとめを作っただけです。
今思えばまとめは作らずに軽く流し見するだけで十分でした(全く身につきませんでしたし)。これからPythonでAtCoderを始める方はこちらのAtCoder用の入門サイトを見ながら問題を解くといいと思います。
2021/01/28にAtCoderに登録しました。
登録後、過去問精選10問を解きました。解くといってもコードを全く書けないので方針をつかんだら解答と解説を読んで写経しました。ながたさんという方がこちらにPythonのコードを載せてくださっています。解説や解答のコードを見ながら、AtCoderの雰囲気を理解しつつ、慣れればB問題までなら解けそうだなって感じました。
次にAtCoder Beginner Contest(通称ABC)の過去問を解き始めました。
コンテストの過去問はAtCoder Problemsというサイトにまとまっています。こちらのサイトでは右上のタブからユーザーID(AtCoderの登録名)を入力して自分の学習状況を確認できます。
とりあえず基本中の基本を身に着けるために2021/01/30のコンテストまでに42回以降のA問題を全て解くことにしました。41回以前は現在の傾向と違うから解かなくていいよって過去問精選10問の記事に書いてあったので解いてません。
最初は入力やforループなど基本的なコードも自力で書けないので解法が分かっていてもなかなか解けませんでした。しかしA問題で問われるコーディングの知識多くないですし、問題自体も単純なので10問程度解けば慣れると思います。
慣れたらスピードアップを目指しつつ、知らないことがあったら調べてコードの書き方を勉強しました。自分の書いたコードがうまく動かないときは、時間がかかってもなるべく自力で解決するようにしました。
また、もっと簡潔な書き方や速く実行できる書き方がありそうだなと思ったらほかの人の解答を見ていました。ほかの人の解答はAtCoder Problemsの「提出結果」→「すべての提出」から言語を指定して検索することができます。
ここまで3日間の勉強時間は1日3~5時間です。
####1回目のコンテスト感想(ABC 190)
コンテスト直前にA問題を全部解き終わりました。
とりあえずA問題は絶対正解してB問題も解けたらいいなあくらいの感覚で臨みました。
結果としては約10分でB問題までスムーズに正解出来てC問題以降は解けませんでした。
目標のB問題を解けて嬉しかったと同時に勉強すれば問題が解けるようになるという自信が付きました。また、この時にA問題をスムーズに解ければB問題は調べながらならコンテスト中に解けるんじゃないかと思い、次回までにB問題を全て解いてコンテストでC問題まで正解することを目標としました。
しかし、パフォーマンスは460でレートが23しか上がらず、1カ月で茶色になれるかは不安になりました。
※AtCoderのレートは「パフォーマンス」という指標に基づいて変動します。A問題(100点)とB問題(200点)の問題に正解した場合、パフォーマンスは300点になるのではなく、得点と解答スピードによって決定された順位によって決定します。そのため同じ点数であってもすばやく正答した人の方がパフォーマンスは比較的高く、遅く解答すれば比較的低くなります。同点の人が多いほど解答スピードによるパフォーマンスの差は大きくなります。
####2回目のコンテストまで
B問題を42回から埋めていきました。
A問題よりは難しく、時間がかかるものの解けない問題は3問くらいしかありませんでした。
少しコーディングに関する知識が増えたり10行程度のコードをあまり苦労せずに書けるようになって成長を感じました。少し難しい問題だと30分以上格闘することもあったのですが、100問くらい解いたあたりから数分で解けるようになりました。
よくA問題やB問題を解ける実力があるのに解くことを「虚無埋め」などといって意味ないよねって言う人がいますが、プログラミング初心者にとっては虚無ではないと思います。理由としては、「考えれば解けるしちょっと考えればコーディングもできる」問題を「解いたことある」「コードを書いたことがある」問題にすることができるからです。私自身、「解いたことがある」基本問題を積み重ねることによって、難しい問題を解く土台を作ったり、つまらないコードのミスを減らしたりすることができると感じました。ほぼノータイムで解答を書けるようになったら次のレベルの問題に取り組んでもいいと思います。
外国語で言えば、定型表現を何回も反復練習してスムーズに話せるように練習する感じです。
この週もより楽な書き方や速い書き方がありそうだなと思ったらほかの方の解答を見ていました。
この週の勉強時間は平均4時間くらいだったと思います。
####2回目のコンテスト感想(ABC 191)
B問題を5問くらい解き残して臨みました。
B問題はサクッと解いてC問題も何とか正解してやるぞって気持ちで臨みました。
A問題はすぐに解けましたが、B問題は安直に答えたところタイムオーバーしてしまいました(AtCoderでは2秒以内に答えを出力できるコードでないと不正解扱いになります)。結局、調べて正解することができましたが思ったより時間がかかりました。この回のC問題は発想が少し難しいですが、要求されるコードの知識はB問題レベルだったので、問題相性が良く、自分にとってはラッキーでした。結局50分程度でC問題を正解出来てコンテストを終えました。
C,D問題の正解者が少なかったため、パフォーマンスが1079も出て、テンションが上がりました。レートも結構上がり、1079は緑レベルのパフォーマンスなので気分は緑コーダーでした。
C問題が解けたことをうけて、次のコンテストまでにC問題をスムーズに解けるようになることを目標としました。
####3回目のコンテストまで
B問題の残りをちゃちゃっと解いてC問題に取り掛かったのですが、いきなり壁にぶち当たりました。ABC190のC問題の解き方が全く分からなかったからです。
解説を読んでbit全探索というものを使えば簡単に解けることが分かりましたが、正解のコードが難しく理解に手間取りました。bit全探索については初心者の方はそんなのがあるんだねーって感じで大丈夫です。
bit全探索と出会ったことで、C問題からは必要な知識が増えると思って緑色になるまでに先人たちが学んだことを調べました。結果、以下のことをこの週で学びました。
- bit全探索
- 二分探索
- 累積和
- 約数全列挙
- 素因数分解
- 最大公約数、最小公倍数
- 貪欲法
勉強する内容については@Kota-Yさんのこちらのページを参考にしました。これらは、毎回自力で1から考えて実装するのが大変なので、コードの書き方をまとめておいて使うときはメモを見ながらコードを書くといいと思います。
また、C問題からタイムオーバーしないための工夫が必要な問題が出てきます。簡単に言うと全部調べると制限時間の2秒を超えてしまうので、効率よく調べて時短する問題が出ます。計算の工夫は、上手に探索する方法を考えることもありますが、そもそも計算を短縮できる関数があったりするので、毎回上級者の方の解説を読んで自分の持っていない知識がないか確認していました。
@u2dayoさんがABC167回以降のA~C問題の分かりやすい解説を載せてくれていますので参考にさせていただきました。もっと古い問題の解説も調べると誰かしら解説してくださっています。
1問解くのに時間がかかるようになりましたが、最終的にABCが大問6問構成になった126回以降のC問題を全て解きました(それ以前は4問構成)。
勉強時間はアルゴリズムの勉強など含めて平均3時間程度だと思います。もう少し短いかもしれません。
####3回目のコンテスト感想(ABC 192)
今回はC問題を絶対に解き、D問題も何とか正解するつもりで臨みました。
B問題までは順調でしたが、C問題で少し悩んで時間がかかってしまいました。D問題が難しく、E問題は私は理解できていないダイクストラ法を使うため結局Cまで正答で終わりました。この回のC問題は易し目で私はCまでを21分で解いたのですが、800程度のパフォーマンスしか出ませんでした。順位表を見ると10分ちょっとで解けばパフォーマンスが1000を超えていました。
この回で易しめの問題を素早く解くことがパフォーマンスにかなり影響を与えることを体感しました。
そのため、次の週までに幅優先探索やダイクストラ法などの経路探索について学習しつつ易しめのD問題を解く練習をしようと思いました。
####4回目のコンテストまで
結論から言うと、この週は経路探索のアルゴリズムを勉強しただけでほとんど問題を解いていません今までプログラミングをずっとしていたからか目に疲労が来てしまって画面を見るのがつらくなってしまいました。
なので問題演習はお休みして以下の勉強にとどめました。
- 深さ優先探索
- 幅優先探索
- ダイクストラ法
これらも初心者の方はこんなのがあるんだねーって感じで大丈夫です。
考え方は分かったのですが、コードを理解するのに時間がかかっていろいろな方の解説を読んでやっと理解できました。幅優先探索はこちらの方の記事が非常に丁寧でコードの意味が理解しやすいです。
ちょっと複雑なコードになると何をしてるか理解できないことが分かり、まだまだ勉強不足だと感じました。
コンテストの前日からABCのC,D問題を数問解きました。勉強時間の大半は経路探索の理解に使い、ABCの過去問は10問程度しか解いていません。
####4回目のコンテスト感想(ABC 193)
Cまでは絶対、かつなるべく速く解いて、標準的なD問題や易しめのE問題がでたら正解するつもりで解きました。
4回目となるとB問題までは簡単に解けて当たり前という感覚でした(難しめのB問題が出たら苦労する可能性はあると感じています)。C問題が前回より難しかったのでここまでで30分かかってしまいましたが、私が正解した段階で2000人くらいしか正解者がいなかったので相対的には悪くないんだなと思っていました。次のD問題は確率の問題でしたが、手計算できる範囲であったら高校数学で出そうな問題でした。解き方が分かれば比較的簡単にコードを書けるので相性がいい問題でした。
最終的にD問題まで解けてパフォーマンスは1070でした。新レートが472となって、茶色になることができました。
#モチベーション管理
精選10問に取り組んでA問題に取り掛かり始めたあたりが一番心が折れそうでした。分からないことがたくさん出てきて頭がパンクしそうになったのですが、あと1問だけ頑張ろうと自分に言い聞かせて解き続けたらだんだんと解いたことがある問題が出てくるようになって楽しさを感じました。
私は水をたくさん飲むので行き詰ったら水を飲んで気を紛らわせていました。水がなくなったら水を汲みに席を立つので体のリフレッシュも兼ねているかもしれません。コンテスト中は1L近く飲んでいます。自分なりの思考のリフレッシュ法があるといいと思います。
普段の勉強中は疲れてきたら音楽や動画を流しています。私はWeathernews Liveを流していることが多いです。お天気番組なので安心してバックミュージック代わりにできるのでおすすめです。休憩中に見ると結構面白いですし、キャスターさんの楽しそうな様子を見ると癒されます。高山奈々キャスターの笑顔は見る栄養剤だと思っています。
#茶色になった感想(どれくらい大変だったか)
ちょうど1カ月で茶色になることができてうれしさとほっとした気持ちであふれています。正直なところ2回目の参加から緑色のパフォーマンスが出ていたので、茶色には近いうちに到達できると思っていました。その一方で学生でなければ1カ月では茶色まで到達することは難しかっただろうなとも感じています。もし私が社会人だったら2カ月はかかったのではないかなと思います。
順調にレートが上がっていましたが、ほかの方のコンテストの成績を見ていると緑パフォーマンスで安定するのは簡単でないことが分かったので、1カ月で茶色になれるかは不確実でしたし、ずっと緑以上のパフォーマンスを出せるかも不安でした。茶色のパフォーマンスが出ていたらモチベーションが大幅に下がっていたかもしれません。私は運よく好成績が続いているだけでこれからスランプに入る可能性もあるので気は抜けないと思っています。
プログラミングへの慣れの面で言うと、A問題を全て解き終わったときにだいぶ慣れて、B問題を解き終わったときには基本的な部分についてはすらすらとコードを書けるようになりました。2回目のコンテスト以降は問題の解法を考えることに集中することができ、コードの書き方が分からなくて悩む時間を減らせました。この点では、C問題を解き始めてからの苦労は、B問題を全て解くまでの苦労よりずっと軽かったと感じています。
#これから競技プログラミングを始めるみなさんへ
1カ月で茶色になれたとはいえ、茶色になることは簡単ではないと思います。こう主張することで自分が偉い、賢いと主張したいわけではありません。思ってもいません。
ちょうど1カ月前の私はPythonのコードを全く書くことができず、Pythonをやっている知り合いもいなかったので孤独に一つ一つ理解して覚えていくしかありませんでした。まともに動かないコードを書いてしまってもそもそも何を間違えているかすら理解できずに1時間悩んだこともありました。
この辛さを超えることが、私に限らず大半のプログラミング初心者には難しいのではないでしょうか。1カ月前の私は思ったように動かないコードを眺めながら自分の頭の悪さに精神を蝕まれていました。
プログラミングを始めたばかり、またはこれから始める方は、最初につまずいても必ず理解できるようになるので辛抱強く頑張ってください。忙しい方が私のやり方で1カ月で茶色になるのは大変かと思いますが、私がとった方法は時間がかかっても間違いなく上達できるやりかたではあります。A問題に慣れたら切り上げてB問題に行くなどすれば効率よくステップアップできると思います。
また、もし灰色から茶色に上がれずに悩んでいる方やB,C問題が解けたり解けなかったりする方は、基本的な問題をたくさん解いてみると出題パターンやよく使う考え方・コードの書き方が身について解ける確率や解答スピードが向上するかもしれません。
A問題に取り組み始めてしばらくは他の人のコードを写しながら理解するだけでもいいかもしれません。
誰か友達に見ててもらってどこが間違えているか指導してもらえばすぐに上達するかもしれません。
もちろんうまく動かないコードを自力で修正することは大切ですし私はそれにこだわりましたが、挫折してしまっては元も子もないので適度に他社に頼りましょう。
自力で勉強して上達するのか不安がある方もいるかもしれませんが、茶色になるくらいのレベルであれば知りたいことは全て先人の方々がまとめてくださっています。また、問題演習についてもABCの過去問だけで十分ですので勉強法に悩む前にたくさん問題演習をしましょう。
分からないことはネットで検索すれば解説記事がたくさん出てきますし、私は詳しく知りませんがTwitterでもAtCoderのコミュニティがあるようです。
#まとめ
私はプログラミング未経験の状態からPythonでAtCoderに取り組みましたが、基本的なコードをすらすら書けるようになるまでがここ1か月間で一番つらかったです。私は(ABC 42以降の)A問題を全部解いてそのあとB問題を全て解くというごり押しのようなやり方で勉強しましたが、初心者の私には合っているやり方でした。
また、A,B問題を全部解くと同じ解き方の問題が何度も出てくるので、一度解いた問題の復習は必要ではないと思います。
下の画像が私が茶色になるまでに解いた問題です。繰り返しにはなりますがAとBは42回以降全て解きました。Cは大問6問構成になってからの問題は全て解き、それ以前の問題を数問解きました。Eはダイクストラ法の問題だけ解いています。
茶色になるためにはC問題を解けるようになる必要があり、高いパフォーマンスを出すためにB問題までは余裕で解ける必要があります。B問題までは問われる知識が少なく、複雑な問題が出ないので過去問で慣れることで十分に対策できます。C問題ではB問題までの知識に加えてbit全探索などの知識が必要なので、それらを理解し、すぐに使えるようにまとめを作っておくといいです。
基本的なことを覚えて簡単なコードをすらすら書けるようになるまでが一番辛いけど絶対にできるようになるので諦めないで少しずつでも頑張ることが大切です。
ここまで勉強の進め方やメンタル面の話が中心となりましたが、技術的な部分は問題演習をとにかくすれば勝手についてくるのでいかに挫折しないで続けられるかが初心者には一番大切だと考えてこのような記事となりました。
また、この記事はPythonでAtCoderに参加している私の体験に基づいて書かれていますので、Python以外の言語を使う際はそれぞれの入門記事も読まれることをおすすめします。
この記事が少しでもみなさんのお役に立つことを願っています。
ご質問・ご指摘等ありましたらコメントしていただけると幸いです。
#参考
- AtCoder公式ページ
-
AtCoder Problems
- 過去問演習ができます
-
Python入門
- Pythonの全般的な入門(AtCoderに限れば使わない内容も多いです)
-
AtCoderで始めるPython入門
- AtCoderで使う内容のPython入門です。最初に出入力の仕方や四則演算など最重要項目がまとまっています。
-
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
- AtCoderに登録したらこのページに行きましょう
-
【AtCoder】普通の人である私が緑になるまでにしたこと
- 4章の「勉強したアルゴリズムとデータ構造」はC問題の勉強のために大変参考になります。こちらの方はプログラミング経験はあるが高校数学は得意ではない方は訪れてみてください。緑になるまでの記事ですが、初心者も参考になります。
-
@u2dayoさんのページ
- ABCのA~C問題までの解説が分かりやすいです
-
Pythonで誰でも書けるBFS(幅優先探索)
- タイトルの通り誰でも書けるようになるくらい詳細にコードの意味が解説されています。
-
きりみんちゃんノート
- 算数も苦手という方のAtCoder参戦記です。こちらの記事で初参加から1年間の振り返りをされています。数学が苦手な方の視点から見たAtCoderの姿が分かります。こちらの方はアルゴリズムの解説記事が分かりやすく、YouTube上でも楽しく振り返り放送をされていますので初心者の方は訪れてみてください。