はじめまして。六月と申します。
・ツイッターはこちらです
・AtCoderのプロフィールはこちらです
風の噂で、AtCoderでは色が変わった際に色変記事というものを書く文化があり、この時ばかりは大いに自分語りが許されると聞きました…。
そこで、もしかすると人によっては、私の色変記事が参考になる可能性もあるのではないかと思い、筆をとりました。
きみたち、おぢさんの話を聞いてみないか…。
お暇な方はどうぞお付き合いください。
簡単な自己紹介
私は40代で、社会人生活の折り返し地点を迎えつつあります。私生活では小学生の子供を持つ父でもあります。大学は文系で、これまで情報科学の教育・訓練を受けた経験はありません。
業界の特性もあり、私の勤務先ではいまだにFAXと手書き書類がかなり使われています。普段はそのような、おおよそITとは無縁の、むしろ昭和ライクな環境で仕事をしています。
そういったこともあり、今の自分のスキルセットで、今後の社会人生活を生き残っていけるだろうかという危機感を以前から持っていました。特に私がいま従事する業務は、おそらく大半が将来AIで代替可能と思われ、そのことも危機感に拍車をかけていました。
また、今の小学校は情報教育が始まっており、子供も学校でスクラッチを使ったプログラミングをするようになっています。
びっくりしました。
おとーさんの威厳ゼロ!
自分が茹でガエル状態になっていることを強く自覚しました。
このような状況ではあと10年もしたら、私など完璧に時代遅れな人間になってしまいます。窓際族のトットちゃんです。瀬戸際のトットちゃんです(言いたかっただけ)。
私も、今からでもプログラミングを勉強してみたい。プログラミングが、私の抱える課題を全て解決するとは思わないけれども、プログラミングで何ができて、何ができないのかくらいはわかるようになりたい。
かといって、何か作りたいものがあるわけでもなく、何から手をつければいいのかわからない。
どうしたものか…。
悩みつつも、元来の怠惰な性格もあり、特に何か行動を起こすこともなく漫然と過ごしていました。
AtCoderとの出会い
2021年4月のこと、ネット上で「Twitterで医師を拾ってきてGoogleのソフトウェアエンジニアにするだけの簡単なお仕事」というブログ記事が話題になっておりました。
そこを経由して、医師からGoogleのエンジニアに転職されたLillianさんの「【転職エントリ】Googleに入社します」というブログ記事にたどり着きました。
それを読み、世の中にはこんなにものすごい人がいるのか、と驚愕すると同時に、競技プログラミング(以下、競プロと表記します)というものがあること、LillianさんがAtCoderを利用していたことを知りました。
ちょうど年度末が終わったばかりで仕事がヒマだったことも幸いし、これも何かの縁ではないかと思い、私も試しに始めてみることにしました。使うプログラミング言語は、市販の解説書が豊富で、初心者でも勉強がしやすそうなPythonにしました。
初めてのコンテスト参加
まず最初に、けんちょんさんのQiitaの記事「AtCoderに登録したら次にやること ~これだけ解けば十分闘える!過去問精選10問~」を読み、書いてある通りに、常設コンテストの「AtCoder Beginners Selection」に挑戦してみることにしました。
最初は標準入力すらもわからなかったので、必死でググり、他の人の書いたコードを書き写したりしながら、何とか初めてのAC(問題に正解すること)を取りました。
そのときに「これは楽しい!!!!!」と興奮したのをよく覚えています。
なるほど、オンラインジャッジを使って、ソースコードを判定するというのはこういうことを言っているのか、と感動しました。
同時に、社会に出る前にこういった素晴らしい環境でプログラミングを勉強できるいまの若者を心底うらやましく思いました。
この頃は、スキマ時間を使ってずっとAtCoder Beginners Selectionの問題を解いていました。
そして整数(int)と文字列(str)の違い、変数の使い方、配列の使い方、forによる繰り返し処理、ifによる条件分岐といった、プログラミングの基礎知識が、問題を解くことを通じてどんどん頭に入っていくのを感じました。
早くもこの、オンラインジャッジを使い、問題を解きながらプログラミングを学習するというのは、ものすごい可能性を秘めているのではないか?と我が身をもって感じ始めていました。
そして、プログラミングの勉強を始めて約2週間、無謀にも私もコンテストに出てみたくなってしまい、初めて参加してしまいました。2021年4月17日の「第二回日本最強プログラマー学生選手権」です。
(難易度はAtCoderの中では一番易しいAtCoder Beginner Contest(以下、ABCと表記します)相当)
結果は2完。パフォーマンスは105と今から見れば低い数値ですが、きっと1問も解けないだろうと思っていたので、コンテスト本番の問題で2つもACを取れたことは、私には望外の結果でした。これで妙な度胸がついてしまい、以降は毎週コンテストに参加することにしました。
PAST本は私の親
私の競プロ生活最大の幸運は、勉強を始めて間もなく『アルゴリズム実技検定公式テキスト』(通称PAST本)に出会えたことかも知れません。
初めてコンテストに参加して思ったのは「全体像を把握できるような参考書が欲しい!」ということでした。年齢的なものもありますが、私には本を使って勉強する方が性に合いそうな感じがしました。
何か指針となり、使い潰せるような本はないだろうか。コンテスト初参加の翌日に書店へ行き、何冊か見比べたのち、比較的初心者向けで、実装例のソースコードがPythonで書かれていたPAST本を買いました。
結果的にはこれが大正解でした。
私は初めてグリッドの問題を見たとき、冗談抜きでまったく何をしていいのかわかりませんでした。ところがPAST本を開くと、そんなグリッドの問題や隣接リストを使ってグラフを管理する方法など、解き方の糸口すらサッパリわからなかった問題の解き方が、私が読んでもわかるように沢山書かれているではありませんか!
「オ、オラ、ヤバい本見つけてしもた!PAST本と心中する~!」と決意し、今も常に持ち歩いています。鳥は一番最初に見たものを親と思うそうですが、競プロerとしての私の親はPAST本だと思っています。したがってPAST本の生みの親である著者のアルメリアさんとkenkooooさんは私の祖父です笑
ちなみに(スタイルと呼べる代物でもありませんが)私のコーディングスタイルはPAST本の影響を強く受けています。たとえば、私はPythonのリスト内包表記を使いませんが、それはPAST本に「必ずしも習熟しておく必要はありません」と書いてあったからです笑(P381)
そういったPAST本の初心者に優しい作りに助けられました。
かえでさんのブログを読んで心を整える
競プロを始めて3ヶ月が経った2021年7月頃、毎週コンテストに参加してはいましたが、レートは200近辺で停滞していました。
(AtCoderでは灰色からスタートし、レート400点ごとに色が変わります。まずは茶色に変わる400点を目標にすることが多いと思います。AtCoderにおける色と、その色が示すアルゴリズム能力との関係については、AtCoder代表のchokudaiさんのブログ記事をご参照ください)
ABCでは、大ざっぱに言うとA、B、C問題でプログラミングやデータ構造の基礎知識を問う問題が出され、おおむねD問題以降から、さらにアルゴリズムの知識を問う問題が出始めます。
ところが、いつもC問題が解けませんでした。勉強したアルゴリズムを使う以前のところで毎回つまずいていました。初参加時は2完、それなりに頑張って勉強した今回もまた同じ2完。全く進歩していないのではないか。そんな自分にガッカリすることが増え、ちょっと心が折れかけていました。
そんな時にかえでさんの「40代で競プロができるのかという話」というブログ記事がちょうど話題となっていました。
これが、もう、私の不安な気持ちをそのまま言語化してくれたのではないかと錯覚してしまうくらいの内容で、深ーーく共感しました。
これを読んで、かなり気持ちが楽になりました。
そして、レートを気にするのをやめることにしました。
そもそもプログラミングを勉強することが第一の目的なのに、コンテストの結果を気にして心が折れたら本末転倒じゃないか、コンテストはおまけだと思って気にせず続けていこう、解ける問題を増やすこと、Pythonで何ができるか理解することに集中しようと決意しました。
そうすると不思議なもので、レートを気にするのをやめてから、3完できることが増えてきました。理由はわかりません。なんなんでしょうね。
そして、かえでさんのブログを読んで触発され、この頃に私も人生初のツイッターを始めてみました。(こちらです)
(2022/08/09追記:ABCの問題はやや難化傾向にあり、2022年8月現在、C問題ですでに典型アルゴリズムの理解を問う問題が頻繁に出題されるようになっています)
茶色になった日
競プロを始めて5ヶ月。レートを気にせず、無心で精進する方針を継続して2ヶ月。
積み重ねが実り、2021年9月11日のABC218でついにレートが400を超え、灰色から茶色になりました。レートを気にしないと言っていたのに、自分の名前が茶色で表示されたときは、さすがに感慨深いものがありました。
なお、AtCoderではコンテスト後に自分の成績をツイッターに掲載して健闘を讃え合う素晴らしい文化があります。
当時私はツイッターの使い方が全然わかっておらず、アカウントを作ったはいいものの、フォローもフォロワーも両手で数えられるくらいでした。私も皆さんの真似をして、成績をツイッターに載せてはいましたが、どちらかというと自分の備忘録として載せていただけでした。
ところが、茶色に変わったことをツイートすると、ものすごく沢山の人から「いいね」と祝福のコメントが届きました。
あたたかい…。これが競プロの世界…。
しかしこの時の私は、コメントの返し方がわからず、コメントを頂くたびに「返信したいがやり方がわからない…。マズイことになってしまった!」と震えていました…。
アルゴリズムもいいけど、ツイッターの使い方も勉強しておけば良かったと後悔しました。あの時コメントをくださった皆様、返信もせずに申し訳ありません!!あの時は、やり方がわからなかったのです。
今はツイッターにも少し慣れまして、おかげさまでリツイートをしたり、コメントに返信をしたりもできるようになりました笑
アルゴ式での精進
AtCoder茶色になって間もない頃、sakさんとけんちょんさんが運営するアルゴ式で「アルゴ式の教材を使ったコーチング/ペースメイキング」のテスター募集がありました。
競プロをやっていると、AtCoderで黄色以上の方々は人の姿をした神ofゴッドだということに気付いてきます。
そんな方々がコーチングしてくれるなんて!
神の気が変わらないうちに応募したい!
乗るしかないこのビッグウェーブに!
しかし皆さん考えることは同じで、やはり応募が殺到し、募集開始から1時間ちょっとで枠が埋まってしまいました。私はたまたま募集直後に知ることができたので、滑り込みで応募が間に合いました。ラッキーでした。
テスター期間中は、苦手だった再帰関数に集中的に取り組み、木DP等の問題が再帰で解けるようになりました。この1ヶ月で再帰を使ったバックトラックはもう一生分書いたと思います笑
また、Pythonの動作でよくわからなかったこと等をたくさん質問でき、充実したテスター期間になりました。感謝しかありません。
アルゴ式は問題の難易度設定が絶妙です。スモールステップで確実に先へ進めるようになっていて、特にDP(動的計画法)の初心者がまず最初に手をつけるなら、私はアルゴ式のDPの問題がベストだと思います。あと私が取り組んだ再帰(「さまざまなアルゴリズム設計技法」のところにあります)もオススメです。
バチャでの精進
界王様との修行(アルゴ式のテスター期間)を終えた私は、AtCoder Problemsでのバーチャルコンテスト(以下、バチャ)に参加し始めました。
この時に参加した「茶コーダーへの道」というバチャへの参加がちょっとした転機となりました。これは灰色上位~茶色下位、つまり当時の私のレートと似た難易度と判定された問題をひたすら解いていくものだったのですが、このバチャを終えると、コンテスト本番で解くスピードが明らかに上がったのを感じました。
AtCoderのコンテストでは、参加者同士が同じ点数だった場合、速く解けた人の方が上の順位となります。私はいわゆる速解きが苦手で、遅い方にいつも位置していましたが、バチャへ参加し始めてから、同じ3完でも以前よりいい順位が取れるようになってきました。
要するに、スピードが足りなかったのは、解く問題の数が足りなかったのです。
その結果として、レートも少しずつ上がっていきました。
ただ、レートは気にしない方針を貫いていたため、私にとっては遅い3完も速い3完も価値は同じです。
レートが上がることは素直にうれしかったのですが、あまり意識しないように努めていました。
典型90とアルゴ数学本での精進
「典型90」とは、E869120さんが作成した典型問題を90問解いていく企画です。AtCoderの常設コンテストになっていて、AtCoderのオンラインジャッジを使って解くことができます。私はAtCoder Problems上で、典型90の問題が難易度順にまとめられたバチャにも参加するようになりました。
ここではいわゆる「考察力」が鍛えられました。
前述の通りABCでは、おおむねD問題以降からアルゴリズムの知識を問う問題が出始める傾向にあります。
ただ、覚えたアルゴリズムをそのまま適用できることはまれで「こういう問われ方をしているということは、この問題文をこのように言い換えることができる。すると、このアルゴリズムが適用できる」といったように、なんらかの考察が必要になるケースがほとんどです。
軽くネタバレになってしまい申し訳ありませんが、たとえば典型90の「012 Red Painting(★4)」はグリッドが出てきます。ということは、こうかな?と思って解くと制限時間の2秒以内に終わらず、模範解答を見ると…そっちかい!!
という問題でした。
典型90のバチャ参加を通して、このような考察力を要求する問題を解くのに慣れ始め、この頃からコンテスト本番でもABCのD問題をACできるようになり、4完できるようになってきました。
私の実力では典型90の★5以上の問題はまだ手が出ませんが、いつか90問完走したいと思っています。
また、競プロerは皆様ご存知の通り、2021年末にE869120さんは『問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本』(通称アルゴ数学本)を上梓されました。私も発売日に早速買い求め、コツコツ読み進めています。
(この書籍で出題されている問題も典型90同様、AtCoderの常設コンテストになっています)
緑になった日
そんなこんなで2022年3月20日、ABC244の参加後にレートが800を超え、緑色になることができました。
ここまでお読み頂いてわかる通り、私は競プロの先達が丁寧に舗装してくださった知の高速道路をただ走ってきたに過ぎません。
この色変記事で名前が挙げきれなかった方もたくさんいます。YouTubeで解説してくださっている方、コンテスト後に解説記事を書いてくださっている方、いつも見ています。
私はそういったコンテンツを出されている人たちのことを本当に尊敬しています。
願わくばいつか私も、そういった「道路を作る側」になれればなと思っています。
最後に 〜私のようなおじさんたちに向けて〜
私が社会に出た頃「英語ができ、会計がわかり、ITリテラシーがあれば今後○年は生き残れる」といった趣旨のことが言われていました。
当時はEメールが送れて、ワードとエクセルが使えれば十分でしたが、あれから20年以上過ぎたいま、必要とされる「ITリテラシー」がどんどん膨張しているのを実感します。コロナ禍を経て、いまや普通の中小企業でもテレワークが珍しくない時代になってしまいました。
そして小学校でも情報教育が始まり、将来はプログラミングですら、膨張する「ITリテラシー」に飲み込まれてしまう時代が来るはずです。
オンラインジャッジを使ったプログラミング学習は革新的です。
私は現時点では、初心者がプログラミングを勉強するならこれがベストだと確信しています。
同年代で、私のように、プログラミングが「ITリテラシー」に含まれる時代が来るまでに、うまく逃げ切れるだろうかと心配している人は結構いるのではないかと思っています。そんな人にこそ、むしろそんな時代を迎え撃つといった気概で、ぜひ競技プログラミングにチャレンジしてもらいたいです。必ず役に立つと思います。
とか偉そうに言っていますが、私もまだ逃げ切れる自信が全然ありません…。
その自信がつくまで頑張るつもりです。
最後に、このような素晴らしい環境を提供して頂いているchokudaiさんやsnukeさんをはじめとする、AtCoder社の皆様に心より御礼申し上げます。
どうか健康に気をつけて、今後も末永くご活躍頂きたいです。
ここまでお読みいただき本当にありがとうございました。
これからもお互い精進頑張りましょう。