こんにちは。こんばんは。現役茶色コーダーのRuteです。
今回は、私が現在抱えていることと、それに対する根本的な原因を自己考察し、今後の精進に活かしていきたい と思い記事を作成しています。
注意:
この記事にはかなり否定的な内容が含まれています。もしかすると皆さんが思っていることと別の事が書かれているかもしれません。現に、半年以上Ratingの百の位が上がらなかった1茶色コーダーの意見ですので、その点ご了承下さい。
【訂正】文章を再度確認し、余計なところを消去いたしました。
章 | 内容 |
---|---|
1 | 競技プログラミングを始める(B1の時期) |
2 | 茶色レートになってから(B2~B2の11月まで) |
3 | Ratingの百の位が「6」から上がらなくなった(B211月~現在) |
4 | 考察 |
5 | 今後の競プロに関する方針等について |
6 | 最後に |
1. 競技プログラミングを始める(B1)
私が競技プログラミングを始めたのは、大学1年生の時でした。同じ学部の先輩に
「競技プログラミングっていう、プログラミングの能力を競う大会みたいなものがあるんだけど、やってみない?」
と言われたことがきっかけで競技プログラミングを始めました。
大学の講義で利用していたPython3という言語で競技プログラミングに参加し、初回のコンテストではA問題を35分近くで解くことが出来ました。
これは、当時参加したときの成績と、初めてACした時のコードです。
Ratingというものも初めて付与され、その時のRatingは2でした。
その後、ABC(AtCoder Beginner Contestというコンテストの名称のみ)で
各問題の初ACの時期を見ていきますが
B問題の初ACがABC126 (2019/05/19)
C問題の初ACがABC141 (2019/09/15)
D問題の初ACがABC148 (2019/12/22)
E問題の初ACがABC148 (2019/12/22)
という感じでした。
ABC148では、E問題を数学的に考察することで80分近くの時間を要しましたがACすることが出来ました!!
このコンテストの成績であるパフォーマンスは私にとって初めての緑パフォーマンスで、茶色レーティングに上がることが出来ました。
1.2 茶色に上がるまでに必要だったアルゴリズム知識
ここで、折角なので私が茶色に上がるまでに必要だったアルゴリズム知識についてまとめます。
最近は傾向が違うのかもしれませんが私の場合は
- 基本入出力
- 条件分岐
- for,whileループによる繰返し処理
- 累積和(N項の数列におけるK項の和を求めるアルゴリズム)
- 素数判定
- 約数列挙
- グラフ知識(BFS,DFSは含まない)
- 文字列処理(簡単なもの)
- 無向グラフに関する知識
くらいだったと思います。
Python3の場合は可読性が他の言語に比べて非常に高いのでこういった知識は早くインプット出来ると思います。
B1の時の成績なんですが、一応こんな感じです。(画像)
B1の時の成績まとめ
2. 茶色レートになってから(B2の11月まで)
B2(大学2年生)になりました。昨年は新型コロナウイルス感染症が蔓延した関係でほとんどの大学で対面授業が廃止され、オンライン授業になりました。
私が通っている大学でも同様にZoomやTeamsというサービスを用いたオンライン授業がほとんどになり、それを受けていたのですが本当にこれが続くと億劫な気持ちになるのは間違いないです。
というのも、オンライン授業って自宅から授業が受けられるという点で便利だったのですが、それがだんだんとマンネリ化するようになり 「授業動画を受けずに録画したら楽できるのではないか?」と考えるようにもなってきました。
また、自宅の外に万が一一歩でも出たらコロナウイルス感染症にかかるリスクが発生すると思い込んでいた私はオンライン授業のために当面の間自宅から出ることを避けていました。(長いときで1ヶ月くらいは本当に外出をしなかったと思います)(実話)
その頃から大学の授業に関する意識というのも低下し、課題提出もギリギリになるようになっていました。
B2の7月の時には技育祭というテックカンファレンスに参加しました。これは本来東京で現地開催される予定でしたが昨今の事情によりオンライン開催多くの競技プログラマーの方と競技プログラミングについて語ったり、私が興味を持っている技術関連の発表を聞いていました。非常にタメになったので競技プログラマーの方は参加することを強くおすすめします。
何の話してたんでしたっけ。競技プログラミングの話に戻ります。
そんな状況の中私は競技プログラミングを続けていました。
茶色コーダーになったのでA問題・B問題の早解きは容易に出来るようにはなったのですが、C問題以降というのは完全に問題との相性やアルゴリズム知識があるかどうかで決まってきて2完~4完をすることがほとんどでした。(実際、ABC148以降5完を経験していません)
また、解ける問題も灰色Diffや茶色Diffがほとんどで、緑色Diffが解けるのはほとんどありませんでした。
Ratingも早解きで上がることが多かったのですが、結局は今の私のRating帯のパフォーマンスに収束することが多くなってきました。
Ratingは714まで上昇しました。これはアルゴリズム力というよりは早解き力で上がったような気がしていると今も感じています。
B2の11月までの時の成績は、こんな感じです。(画像)
B2の11月までの時の成績まとめ
で、この頃から私にはアルゴリズム力がなかったように感じ、アルゴリズムの勉強を本格的に始めた訳なんですよね...(私は所謂天才だったり神童とか呼ばれるほどの頭脳を持っている訳では無かったので、本当に遅いと思っています)
3 Ratingの百の位が「6」から上がらなくなった(B2 11月~現在)
11月から本格的に「けんちょん本」という名称で呼ばれている「問題解決力を鍛える!アルゴリズムとデータ構造」という本を購入してアルゴリズムの勉強を始めることにしました。(それまで蟻本や螺旋本と呼ばれる本も買っていました)
「けんちょん本」という本は本当に分かりやすくアルゴリズムを説明しています。問題演習も実際にAtCoderの問題や典型問題を中心に収録されていて良い本だと思いました。
またこの頃からYouTubeに解説動画の投稿を開始。
2021年1月には今日のA問題と題して令和ABC(ABC126)以降のA問題について全てPython3の実装を含めた解説動画を投稿していました。
これは、近年競技プログラミングに関係するYouTuberが多くなってきた中で差別化をしようと思い
「簡単な問題を解説しているYouTuberはあまりいないのではないか?」
というアイデアが生まれ投稿するようになりました。
現在はそれと同様の考えで令和ABC(ABC126)以降のB問題を解説する
今日のB問題という解説動画シリーズを投稿しています。
ただ最近はターゲット層が少ないためかA問題・B問題の解説動画と比べ再生回数が伸びていません。それでもこれからPython3で競技プログラミングを始める方に対して分かりやすい動画にするために投稿していきたいと思っています。
この頃から、以前灰色や茶色でTwitterをフォローしたユーザーが次々と入茶や入緑するということが増えてきました。
はじめは「おめでとうございます!!!」という気持ちでこれらのツイートを見ていたのですが、これが毎週のように当たり前になってくるとただただ「羨ましい」という気持ちの方が先行する様になってきました。
そんな中私はここ最近こういう状態に悩まされています
- 「3完しないとレートが上がらない、かといって解けないことを認めたくない」
- 「『は!?なんでこんな典型問題も解けないの!?』等と周りから言われたくない
(周りから自分の成績について冷たい目で見られないようにしたい) - 解説動画を投稿しているので、3完が当たり前で灰Diffが解けないということを認めたくない
- 典型問題が出たとき、ある程度のアルゴリズムだったらわかるがある一定以上の基準で解けないと思い込んでしまう
- またレートが下がるのか...と思うようになってしまう
...まだまだいろいろとありますが、これ以上出しても皆さんの気持ちを無やネガティブな感じにさせてしまうのでここまでにします。
実際の所は結局2.で説明した状態と同じように早解き力で上位の成績を取ることが多く、現状は改善していなかったです。
その影響で最近はRatingが上がる、下がることを繰り返すようになり
半年以上Ratingの百の位が6から変わらないようになりました。
その間大量に鬱ツイートや悲観的なツイートをしたのは認めます。これによって害を与えてしまった方に対しては本当に申し訳ないと思います。
事実、スランプというものを感じるようになってしまって、競技プログラミングへの意欲も低下。
コンテストに参加しない日が多くなったり「ARCは緑色にならないと人権がない」と思うようになってABC級しか参加しないようになりました。
入緑するにはどうするか という記事も多く閲覧させて頂きました。私にはこのことが当てはまっているはずなのに、なぜ入緑しないかが本当に謎です。
また、この頃から急激に集中力が低下していました。問題が解けないとそれに対して自分を追い込むようになり
解説ACと呼ばれる問題の解説を見る行為を避けるようになりました。(時間がかかった場合は解説ACをする場合がありますが)
(こういうことって本当は良く無いと自覚していなかったんですよね...今思うと馬鹿馬鹿しいです)
解説ACは問題への理解をするためには誰しも通らないといけない道なのですが、「解けない」ということを認めたくなかった私はそれを避けることが多くなっていました。
また解説を読んでも、他の方の説明を聞いても理解が難しい、と思うようになってしまいました...
競技プログラミングに参加することは本来義務ではありません。
それが正しいのなら、AtCoderコンテストに日本人全員が参加して(仮定の話です)
ジャッジサーバーに対して毎回大量の負荷がかかってunratedになり続けると思います。
これでは競技自体が成立しないのです。
これを私の場合は義務だと思っていた時期が最近ありました。
「入緑して早く一人前として認められたい」
ということに固執してしまい、毎回のコンテストに対して「Ratingのためだけに参加している」ことが多くなっていました。
最近はパフォーマンスが低いとそれに対して否定的なツイートをすることが多くなってしまいました。先ほども言いましたがこれで気を害された方がいたら本当に申し訳ないと思います。悔しいですが、私の実力不足だと思います。認める他ありません。
B2の11月~現在までの成績は、こんな感じです。(画像)
B2の11月~現在までの成績まとめ
最近はRatingの浮き沈みが激しく、自分に対して否定的な感情を持つことが多くなってしまいました。どうにかして改善をしたいと思っています。
4 考察
以降は、最近入緑されたryusukeさんの入緑記事の内容を参考に私の現状を考察したいと思います。
初中級者が解くべき過去問精選 100 問 の全埋め
実際の所、これはなんと数えたところ10問も埋まっていません。
原因としては「どうせ解けない」だの「そんな知識ない」だのと自分自身に対して難易度に関する思い込みを持ってしまっていて解く気力がなかった(精神論)からだと思っています。
つまり、何が言いたいかと言うと、難しい問題に出会ったらとりあえず解説AC(答えを見てなるほどーって軽い気持ちで写経してAC)をして、とにかく100問最後まで解ききると言うのが大切だと思います!!
とありますが、これは確かに今の私の方針とは完全に逆で、「解説AC」を推奨しています。「解説AC」をするのは個人的にはやりたくない行為だということは前述させていただいたのですが、ここまでratingが上がらないともう「解説AC」をする必要があるようです。もうRatingも上がらなくなってきたのでそろそろやってみることにします。
AtCoderの緑diff100問以上AC
これは私のAtCoder ProblemsでのDifficulty別AC問題数を円グラフにしたものです。
- 灰Diff (574/579 , 99.1%)
- 茶Diff (161/200 , 80.5%)
- 緑Diff (76/195 , 39.0%)
ご覧の通り、緑Diffが100問も解けていません。
(多分そのうち大半が本当に分かっているかを疑うレベルです)
これも前述したのと同じ理由で解けていません。「解説AC」というのは何度も説明していますが「自分自身に対して負けを認める」ということなので避けていましたが、この際認めたいと思います。
感想としては、とてもやる意義があったと思います。やはり、緑は自分が目指していた問題なので、それを解くことで緑のレベルを知ることが出来るし、とても効率の良い勉強法ではなかったのでは?と自分では思ってます。
効率は実際私の場合良く無くて、1つの緑Diffに対して1時間以上ACするのにかかってしまっていることが多いです。
解説ACをすれば効率が良くなるかもしれないので、今後は30分以内,20分以内に解けなければもう解説を見てもいいかもしれませんね...
競プロ典型90問 に挑戦
競プロ典型90問 とはe869120さんが毎日1問ずつ投稿されている、
「AtCoder の問題を解くために必要な実力を付けるために作られた「典型問題」を解いていく企画」です。
私も解いているのですが、毎回茶Diff程度まで解けることが多いです。
(灰Diffが解けなかった時もあり、その時は「こんな典型も解けないのかよ!!」とただ自分に対して憤りを感じることもありました。
ただ、問題自体は非常に典型的なものが多く、解説も絵などで分かりやすしてくれているので、適正レート帯である200 ~ 1999の競技プログラミングユーザーの方は、典型問題を解くために解いてみることをお勧めします
また、これは最近考えているのですが「典型90問」を解くDiscord会(もくもく会とも呼ばれることがありますが)のようなものを開こうかと考えています。興味がある方は私のTwitterまたはこの記事にコメントをしていただければ嬉しいです。
ちなみに類題についても解いています。
毎日精進(連続Streakの記録伸ばし)
自分が言いたいことは何かというと、自分のように力もつかないような(自分の色よりも下の色の問題)を解くのは絶対に効率が悪いと言うことです。
確かに競技プログラミングをするという習慣はつきます。しかし、そのせいで私生活に影響が出たりもしてきます。
逆に私の場合ってこういう問題が解いていない問題の中では全くといって存在しませんし、逆に解ける問題が少ないと思います。毎日精進していますが、解いた問題が中心なのでStreak伸ばしは出来ていません。
だから、これ以降は自分(該当する読者の方で賛同して下さっている方がいるならその方も)は出来る日に、時間のある日に問題を解いて、特に難しい問題、まだ自分の知らないアルゴリズムを勉強する、こういった姿勢がレートが上がる最善策ではないのかと思います。
最善策らしいのでやってみることにします。実際私の場合大学の講義がない時間帯に問題を解いてアルゴリズムの勉強をしていますが、これでも伸びないのでそろそろ勉強法を変えないといけないと思うようになってきました。ただ私自身これまで勉強法を何度も何度も変えてこういう状態なのでもう2度と変えないような勉強法を何か作ってみたいと思います。
アルゴリズムの理解度
ryusukeさんが作成されたものに基づいています。
(着目したい点を赤字で表記しています。これは個人見解です)
アルゴリズム理解度表
1 | 2 | 3 | 4 |
---|---|---|---|
アルゴリズム | 理解度(ryusukeさん) (◎・△・×・茶) |
理解度(Rute) (◎・○・△・×) |
重要度 (高・中・低) |
最大公約数・最小公倍数 | 茶 | △ | 高 |
高速素数判定$O(\sqrt{N})?$ | 茶 | ◎ | 高 |
エラストテネスの篩 | ◎ | × | 中 |
素因数分解 | 茶 | ◎ | 高 |
約数列挙 | 茶 | ◎ | 高 |
半分全列挙 | △ | × | 低 |
累積和 | 茶 | ◎ | 高 |
いもす法 | ◎ | △ | 高 |
高速なべき乗計算 | ◎ | × | 中 |
逆元の利用 | × | ○ | 低 |
bit全探索 | 茶 | ◎ | 高 |
二分探索 | △ | △ | 中 |
幅優先探索(BFS) | ◎ | △ | 高 |
深さ優先探索(BFS) | ◎ | △ | 高 |
DP(動的計画法)(基本) | ◎ | × | 中 |
区間DP | × | × | 低 |
bitDP | × | × | 低 |
ダイクストラ法 | ◎ | × | 中 |
ワーシャルフロイド法 | △ | × | 低 |
ダブリング | △ | × | 低 |
クラスカル法 | × | × | 低 |
RLE | ◎ | × | 低 |
LCS(最長共通部分文字列) | ◎ | × | 低 |
LIS(最長増加部分列) | ◎ | × | 低 |
Unio-Find木 | ◎ | △ | 高 |
座圧 | ◎ | × | 中 |
この表を見て気づいたことなんですけどダイクストラ法って緑色でも要求されるんですね...私が初めて1年くらいの時は水色付近で要求される知識だと思っていましたが、最近は緑色なようです(過度に真に受けた場合)
こうして見ますと私がryusukeさんに比べ理解できていないアルゴリズムが多く、現状維持の状態が続いていることに対してもある程度納得できる材料になりそうです。
今後はアルゴリズムの勉強をして、それについて分からなければ皆さんのことを頼るかもしれないです。私にとっては何度も言っている通り本当に悔しい事なんですけど、手助けして頂ける方がいたら今後ともよろしくお願いします。
モチベーションの維持について
これが本当に喫緊の課題であることは間違いありません。
・その方をミュートにする
・今までAtCoderをやって来てないだけで、自分よりもアルゴリズムに詳しい
・最悪の場合、ブロ解(ブロックをして解除することで、フォローを外すことが出来ます。)を行う。
などと言った思考・処置をすればこういう被害は削減できると思います。
はっきり言います。ブロック解除、ということはやりたくありません。というのも、ブロック解除をするのが怖いです。興味本位でフォローした人を突然裏切ってフォローを外すという行為が、私自身本当に嫌で避けています。(よほど私に対して否定的なことを言ってきた方に対してはブロックしていますが、最近はブロックしていません)
ミュートは、ミュートした方に対してあまり影響がないので、万が一の場合考える予定です。
最近は私と同色帯ぐらいの方がYouTubeチャンネルを見るなどして私をフォローして頂いているということが多いです。知名度が上がってきたんだなと実感しています。その分、発言に関しては気をつけなければいけないので今後もSNSやYouTubeの運営などについては気をつけていく所存です。
それから単純に伸び悩んでいる方でメンタルがやられる方も多いと思います。
確かに問題の愛称はとても大きく影響してくると思います。
ですが、昨日の自分よりは、今日の自分の方が経験値が豊富のはずなので、最後まで諦めずに頑張ってほしいです。
これは本当にそうで、私の場合1000問近く問題数を解いている という実績があります。それが徒となってしまい結局解けないと「入緑は無理なのか」と思い込んでしまうことが多いです。
RPS(Rated Point Sum)の数値は毎回のコンテストの参加などで多くなっていますので、それを自信に変えて今後は取り組みたいと思っています。
長々となりましたが、これが私がryusukeさんの記事を見て考えた自己考察でした。
5 今後の競プロに関する方針等について
長々と考察などをしていきましたが、私の今後の競プロに関する考え方でも記述しておくことにします。
-
「解説AC」を恐れない
これは本当にそうで、今まで私は「解説AC」に対して否定的な考え方をしていました。この考え方が続いてしまうと、結局また今までのことと同じ事を繰り返してしまうので、今後は分からない問題に対しては積極的に解説ACを行っていきたいと思います。
解説ACをする時間についてはDifficultyによって異なりますが、大体これくらいの時間を想定します。
Difficulty | ~399 | 400~599 | 600~799 | 800~999 | 1000~1199 | 1200~ |
---|---|---|---|---|---|---|
目標解答時間 | 10分 | 20分 | 25分 | 35分 | 45分 | 50分 |
解説AC基準 | 15分 | 25分 | 30分 | 40分 | 50分 | 50分 |
これは個人的な主観によるものであって、他の方だと異なるかもしれないですが、一応当面はこの時間でやっていきます。たとえ「どうしても解けない」と思ったとしてもこの時間までは継続して解いてみることにします。
- 水色・緑色の方など中心に分からない問題について聞く癖をつける
私の場合、これが出来ていないことが多いので今後週1回程度は解説などを見ても解けない問題についてdiscordなどで相談する機会を設けたいと思っています。協力して頂ける方がいたら本当に嬉しいです。よろしくお願いします。 - Ratingが下がることに対して否定的になるな
私は他の皆さんに比べて茶色で知識が乏しいかもしれない、実装力が低いのかもしれない。にもかかわらず自分に自信があるせいでRatingが下がったことに対して否定的な感情を持っていることが多いです。なのでそういう考え方を「次は出来る!」といったポジティブ、肯定的な考え方にしたいと思っています。
で、"今のRuteは解説動画上げるべきじゃない"などと考える方も一部いるかもしれませんが、
私は今後も積極的に競技プログラミングの過去問についての解説動画を投稿していきたいと思っています。
解説動画を上げる目的として
「高校生・大学生を中心に多くの方に「競技プログラミング」というものを知ってもらい、その理解を深められるような動画を作りたい」
というものを考えています。
現に私は今日のA問題や今日のB問題などといった解説動画シリーズを投稿しています。
もちろん茶色コーダーなので解説に若干の矛盾などが生じるかもしれません。それも温かい目で見て頂けると本当に嬉しいです。
よろしければ私のYouTubeチャンネルへの登録もよろしくお願いします。
Ruteチャンネル-YouTube
週に1回以上はかならずアウトプットとして解説動画を投稿し続けています。
6 最後に
ここまで記事を見て頂き本当にありがとうございました。
これは私がスランプが長期化したことに対して投稿した記事であり、おそらく見ている方もやがて競技プログラミングのRatingが伸び悩むなどといったスランプを経験するかもしれません。
そういうときはこんな感じに自己分析をしても面白いかもしれません。
(やったところで時間の無駄かもしれないですが、やってみると案外自分が分からなかったことなどを再認識できると思います。)
この記事に関して質問点等あればコメントで教えて欲しいです!