はじめに
初めまして、Reidと申します。今回はAtCoderで約 一年かけて緑コーダー(アルゴ) になった区切りとして記事を投稿したいと考え、競プロと出会った経緯、良かったこと、色変に役立つかもしれない話をしていきたいと思います。
目次
自己紹介
- 情報工学科の三年生
- 大学は地元の国立大学
- 大学入学後にプログラミングを始めた
出会った経緯
元々、「ゲームが作りたい」という意思を持って情報工に進学を決め、大学では意欲的に技術系の部活動に所属していました。はじめはプロジェクトに参加してGitを扱ったり、UnityやUnrealEngineを触っていました。しかし、一年、二年と経つうちに先輩や同期達のような「ものづくりに関する興味関心」が自分にはない、周囲から置いて行かれている、という感覚を覚えるようになりました。このころの自分はかなり真剣に悩んでいました。
そんな中、ある友人から「同学科の〇〇君が茶色になったらしい」という話を聞きました。それに対して私が「競技プログラミング、聞いたことはあるけど、モチベーションがないや」と返したところ、「やる気がないって言っていたらいつまでも変わらない(意訳)」と怒りの返事が
しかし、私はその友人の一言でモチベーションが一気に高まりました。(その友人にはとても感謝しています。)
灰色コーダー時代(4ヶ月)
C++についての理解を深めた期間
火が付いたことでとりあえず入茶記事等を漁って(大事)、方向性を固めていました。その中で実践していたのは
の3つでした。この頃はアルゴリズムを学習するというより、 「自分がやりたい処理」をC++でどのように記述すれば良いのか? を日々学んでいる感じでした。〇〇したい→こういうコードという感じにメモして整理して頭に入れていくと良いと思います。
当時参考にした記事
https://note.com/jikky1618/n/n0814c5803391
茶色コーダー時代(4ヶ月)
様々なコンテストへの参加、SNSアカウントの作成
ここからは灰色に比べると結構内容が濃いため、書きすぎないように気を付けました。
ICPC予選参加
ICPCとは
International Collegiate Programming Contest (国際大学対抗プログラミングコンテスト) のこと
ICPCの話を耳にして友人2人を突然誘ったのですが、ありがたいことに一緒に出てくれることになりました。結果は予選落ちでしたが、3時間脳を振り絞って戦った記憶は今でも鮮明に覚えています。また、実力不足ながらも予選に出たことは 今後のモチベーション上昇にも大きく貢献しました 。(なんと順位は256位で、運命を感じました。)
反省点としてチームワークを向上させる時間を設けられなかったことがありました。自分の中にある考察の言語化は難しく、本番は各人でそれぞれの問題を並行して考察をすることになってしまいました(理想としては相談等がしたかった)。来年の参加に向けてその点を改善したいと考えています。
Twitter(:現X)アカウント作成
競技プログラミング勢と繋がりたいという思いが溢れ、Twitterアカウントを作成しました。SNS上にはレート上位の方が溢れていますが、自分と同じくらいの実力で頑張っている人も存在します。基本的に努力家が多いので見ているとモチベーションがグングン上がること間違いなしです。界隈には意外と中高生が多くて驚きました(天才しかいない)。
競技プログラミングに全振りした夏休み
大学の勉強も落ち着いた夏休みからは、本腰をいれて競プロに取り組みました。
- 『競技プログラミングの鉄則』A問題を全部解く
- 『典型90問題』☆4以下全部解く
という目標をSNSで宣言して取り組んでいました。進捗をTwitterで報告することで、満足感とプレッシャーを得て、良いサイクルが生まれました(各々一ヶ月ずつかけて無事に目標達成)。この頃になると緑パフォーマンスが安定していて、「緑コーダーになれる。」という自信が湧いてきていました。
↑こんな感じで固定ツイートにリプをぶら下げていました。
オンサイトコンテストに参加
くしらっちょさんが主催しているオンサイトコンテスト、通称「緑以下コン」というものがあるのですが、開催地が東京なこともあって(筆者は他県在住)ギリギリまで悩んだ末に参加を決めました。(SNS上の知り合いの後押しに感謝しています。)
緑以下コンテストとは「緑diff相当以下の問題のみで構成されたコンテスト」という意味合いなのですが、結果として緑diff相当は一問も解けず、灰色相当でも躓くという惨敗に終わってしまいました。
しかし、そのような結果に関わらず満足感がありました。これはなぜかというと、オンサイトコンテストの雰囲気、SNS上の知り合いとの会話そのものが楽しかったのです。主体性もなく、自信もなかった以前の自分と比べると、わざわざ東京に日帰りで来てコンテストに参加したり、結果にもめげないなど大きな成長を感じました。
ADTと緑diffを解く毎日
緑以下コンテストで失敗した理由に「典型解法は知っているが、それを各問題に当てはめる力がない」ということが挙げられると考えました。そこで、
- AtCoder Daily Training(Medium)に取り組む
- 毎日(ABC212以降の)緑diffを解く
という目標を掲げました。
それぞれ目的として
- ADT→実力相応、知識としては習得済みの問題に対する安定感を上げる
- 緑diff→思考力、考察力をつける
というものがありました。思考力に関しては分かりませんが、「解くべき問題を解く力」については実力の伸びを実感することができました。
ABC378でついに入緑
コンテスト自体はEではなくF問題に取り組むべきだったという反省点があり大成功ではないですが、D問題のDFSを素早く書くことができて最高パフォーマンスを更新できました。
AtcoderProblemsを見てみたところ実際に勉強していたのは半年くらいになります。ライバルのアチーブメントを見るとモチベーションが上がりますが、「自分より少ない精進量なのに自分より強い・・・」みたいな落ち込みをしないようにしましょう。「それまでの勉強(特に数学)の積み重ね」の違いがあるだけだと考えるべきです。(プログラミングは筋トレだと思っているので、勉強という基礎の体力があると、伸びて当然だと思います。)
記事を書くのに夢中で今日の精進忘れている図(Current Streak=0)
ABをとりあえず埋めてAC数を稼ぐのは途中からあまり意味がなくなってくるため、ADTなどで早解き(≒筋の良い実装をする)を鍛えると良いと思います。少しEを解いてるのは緑diffだったからという理由です。(このFは何・・・?)
精進中に工夫していたこと
工夫したこと(脳内リソース問題)
メモを振り返ると結構あるのが「脳内リソース問題」でした。これは「while文とfor文どっちを使うか迷う」「indexをiかi+1で迷う」など本質的でない部分に思考が割かれてミスをしたり、時間をロスしたり、考察が上手くできなかったりすることを指しています。これらの問題は単純に問題が解けた/解けなかったではなく、自分の思考を観察することで弱点として捉えることができると思います。
克服方法として自分が実践していたのは
-
復習時に、自分が理解しやすい・扱いやすいコードに書き直してモヤモヤを解決する
-
慣れで自然に解決する
の2つでした。後者に関しては言うことがありませんが、前者に関しては次回以降に「同じ悩み方」をすることが減り、効果的だったと感じています。このような思考の流れを観察したりするには「精進時、考えたことを全て紙に書く」ことが大切だと思います。紙とペンなしでACできるとかっこいいですが、サボらずにやった方が良いと個人的に感じました。
(大変字が汚いですが)考えたことはこんな感じでとにかく紙に書いていました。
解説ACするべきか
時間は有限なので非常に悩ましいです。理想としては「知っている解法なら自力で解く」「知らない解法なら解説を見る」ということなのですが、「自力で解くべき」ということが分かってしまった時点で「解答方針のネタバレ」が発生するので、機械的に判断するのは難しいと私は思っています。未だにはっきりとした基準を決めていませんが、とりあえず「解説と実装例は読むが、自力での実装は必ず行う。」ということだけはやっています。(正直言って私のレート帯だと、解説をさっさと見て真似するのが正義かもしれません。正直悩み中)
どのくらいの難易度を解くか
これも難しいのですが、自分と同じ色のdiffを解くのが一番実力付くと思います。しかし、背伸びした問題に対して考察を重ねると思考力が鍛えられます。私は結局「自分の色のdiffの問題と、その一個上のdiffを同時に精進していく」というスタイルに落ち着いています。
レートを下げてしまった時にいかにモチベーションを保つか
はじめのうちはレートが単調増加になっていても、実力とレートが近づいくると下がってしまうことがあります。はじめて下がった時は本当に落ち込みました。私だけではなく、レートが下がることは多くの人が経験することだと思います。
そんな時は「レートは現在の実力ではなく、コンテスト中のパフォーマンスから推定されたあくまで予想であり、成長曲線とは異なる)」、「今回は自分の弱点に気づく絶好のチャンス、参加しただけで実力が付いた」といったように思考の転換をするべきだと思います。とはいえ私も どうしても落ち込む時は落ち込みます。 というか前回パフォーマンスが上振れしていた時はよく冷える気がします。そんな時はレートを支払って質の高い精進をしたと思っちゃいましょう。
生成AIについて
色変記事としては話が逸れますが、最近競プロ界隈で度々話題になる生成AIについて、拙いながらも私の意見を述べたいと思います。AtCoderでは生成AIに関して以下のようなルールが現在(2024/11/05)定められています。
このコンテストでは、生成AI対策のため、問題文を直接生成AIなどのプログラムに与えることを禁止しております。詳しくは以下のルールをご確認ください。AtCoder生成AI対策ルール
(以下は公式ルールからの抜粋)
人間が認識した問題文に基づいて人間が出力したものを生成AIに入力として与えるのは許容します。
アルゴリズムの実装案を要約したもの
問題文を要約したもの
一度人間を通していれば、問題文を一字一句タイピングして写したものを入力として与えるのも、現時点でのルールでは許可します。
(2024/11/05時点)
以上のようなルールはありますが、直接でなければ使用するのは問題ないと言及されており、たまに「今後、努力してきたことの意味がなくなってしまうのではないか。」という不安を覚えることはたしかです。これからもAIブームが続くかはわかりません。しかし、そんな不安定な時代で、AIから奪われない領域に逃げるといった思考ではなく、自分を貫けることの方が重要ではないかと私は考えています。つまり、生成AIの台頭によってモチベーションを保つのが難しい中でも、できることを見つけて努力したり、AIに負けじと自分を磨く人こそが輝けるのではないかということです。(生成AI自体を否定するものではないです。)
競プロに出会って良かった
良かったことを列挙すると
- 大学内外問わず友人が増えた
- 精進環境を整えるための技術周りに(wsl、vim、zash)に詳しくなった
- 「好きなもの」という軸ができたお陰で主体性が身についた
- 純粋に精進が楽しくて人生の楽しみが増えた
などがあります。特に「軸ができた」という感覚は大きく、情報工学科の学生、ひいてはエンジニアとして成長するための火種になると感じています。もちろん、競技プログラミング内で強くなりたいという願望ありきですが
今後の目標
次に達成したい目標に
- 水色になること
- 競技プログラミングが便利になる、楽しくなるようなプロダクトを作りたい
というものがあります。そして実現する手段として
- ADTに全日出る(毎回テーマがあるので、弱点発見に非常に役立ちます。)
- 緑diffを安定させる(現在進行中の毎日緑diffチャレンジ)
ということを考えています。これからも楽しみながら精進していきたいと思います。
最後まで記事を読んでくださった方、ありがとうございます。