この記事ではその辺の非情報系の理系学生が競技プログラミングサイトAtCoderの世界を少しだけのぞいてみて感じたことを書き残しています。かなりブランクが空いてしまったのですが、入茶記事とやらもかねています。
最初にグラフだけ載せときます。なんとなく汚かったので前後のブランク期間の部分を切ってます。ゆるゆるとした曲線を描いていますね。
![](http://dead-reckoning-days.com/wp-content/uploads/2022/12/031aaa60bfb99d791ab3452ce382625e.png)
この記事に書いてあること
・筆者のバックグラウンド
・具体的に何をしたのか
・非情報系でもいっぱいいいことがあったよという話
筆者のバックグラウンド
入(任意の色)記事をいくつか読んだのですが、筆者がAtCoderに必要そうな分野をどのくらい知っていたかみたいな話があったほうが色々イメージしやすいと思ったので、AtCoderをやり始めた当時のプログラミング経験・数学のバックグラウンドについてまず書いておきます。
プログラミング経験
私はどちらかというと機械より学科の人間で、プログラミングの授業はほんとに基礎の文法を習っただけみたいな感じでした。あとはゲーム作りてーとかウェブサイト作りてーとなって、数日でできるようなのを作って飽きるみたいな感じのレベル感です。アルゴリズムっぽい知識はほぼ0です。
数学
高校の時は数学の問題演習がだるすぎて白紙で提出していたような罪深い人間です。大学入試の共通一次の数学が8割行ってないくらいの人です。大学の数学の講義は、とりあえずテストは解けたけど・・・という感じです。
こういう感じの人が「最近Twitterのbio欄にAtCoderの色を書いてる人いっぱい見かけるなー」って感じのきっかけで手を出してみることにしました。
具体的に何をしたのか
あまり過去問を解かずにコンテストに出まくる(←多分あんまり良くない)
AtCoderには精進という素敵な文化があるにもかかわらず、「まずは場慣れするのが大事」という言い訳をしてあまり過去問を解かずにコンテスト (ABCだけ) にだけ出まくりました。あと復習もしんどいときはしないという日々が続きます。よくないです。
それでも、のろのろと茶色までレートを上げることができた大きな要因は、(王道ではないかもしれませんが)単純に簡単な問題が速く解けるようになったことだと思われます。何回もコンテストに出ていると「問題を読んで、それを解決するにはどうしたらいいか考えて、そのまま実装する」というルーティーンに慣れたような感覚がありました。つまり「the・アルゴリズムっぽい知識」がなくても解ける問題を解くスピードが上がったのだろうと思います。
最近はAtCoder以外でプログラムを結構書く機会が多いのですが、これだけでも何もしないよりは結構普段のプログラミングに役に立っていたような気がします。趣味でちょっとプログラムをする人でも、というかそういう人こそ腕をなまらせないためにAtCoderをやるのもよいのかもしれません(?)
名著・名記事を通読する(←多分めっちゃ大事だし、楽しい)
コンテストにある程度慣れてからも不安定に1~3完をうろうろするのが数週間ずっと続いたので、途中からさすがに何か勉強をしないとなーと思い、本屋さんで名著らしき本を(けんちょん本と呼ばれているものです。)購入し、分かる範囲で通読してみました。これが想像以上に面白かったです。何よりも新しい考え方を導入することで世界が広がる感覚がうれしいのかもしれません。アルゴリズムっぽい知識は何にも持ち合わせていなかったので、2分探索とかデータ構造の比較とかグラフ探索とかを初めて知ってわくわくしました。
ただ、新しい考え方を知ったのに問題を解いてみると実装レベルまで理解できていないことに何度も気づかされたので、現在はようやく反省して前よりは過去問、練習問題に取り組もうと思っています。
なので実質的には入茶までにやったことのほとんどは簡単な問題を比較的早く実装できるようにコンテストに出まくるといったことになってしまう気がしています。逆に言うとthe・アルゴリズムっぽい知識が薄くてもゆるゆると時間をかければ茶色までは行けてしまう可能性があるということになるかもしれません。
非情報系でもいっぱいいいことがあったよという話
あらゆる場面に潜むアルゴリズム
私は所属している学科の性質上ロボット的なもののソフトを書くことが多いのですが、大きなデータを扱うセンサ(画像とかレーザースキャナとか)とか、ロボットの行動指針を考えるときに「the・アルゴリズムっぽい考え方」が結構登場します。
そのときに「あー、データ数が…だから~というデータ構造をつかわなきゃ」といったような計算量を(雑魚なりに)意識して書いたり、「あー、この地図の探索手法って構造的にグラフ探索じゃね」みたいな気づきが楽しかったりします。
関係ないですがプログラミングをしていると同じくらい「あー、低レイヤーっぽい知識があれば・・・」といった場面に多々遭遇するので時間が許すなら次は低レイヤー的なものに手を出そうかなという気持ちもあります。
手がはやくなった気がする
私は今はかなりブランクが空いての再開なので説得力0ですが、毎週大体同じ時刻にコンテストがやっているととても習慣になりやすいと感じました。そしてやっぱり毎週プログラミングに触れていると自覚できるくらいに(基本的な実装だけだけど・・・)手がはやくなった気がします。
以前はよく何かを作ろうと思ったときに「でも、コード書くのめんどいなー・・・」という気持ちがあったのですが、現在は前よりもプログラミングに対して前向きになったような気もします。なので、モノづくりしたいけどプログラミングに苦手意識がある人こそまずはゲーム感覚で始めてみてもいいのかもしれません。
これから・・・
昨日久しぶりにコンテストに参加したので、これからゆるゆると続けていこうとは思っています。ここまで参加してみてこれ以上の上達のためにはやはり「the・アルゴリズムっぽい知識」を実装できるレベルまで理解できていることが必要だと感じているため、これからは新しい考え方の勉強とその演習に時間を割こうと思っています。数独とかクロスワードみたいな感じで深夜寝れないときとかに趣味としてやっていくと生活がちょっと豊かになるような予感がします。
Comments