アルゴリズム | AtCoder2ヶ月続けてみた感想

走る

みなさんこんにちは。相変わらず幅優先探索やメモ化再帰など、アルゴリズムに関する知識がほとんど付いていない小幡です。それでも、しがないプログラマーとして生きていけるのは、周りの人の支えがあっての事なので、感謝しています。ありがとうございます。

前回の記事からおよそ一ヶ月経ったので、2ヶ月目の感想記事を書きたいと思います。1ヶ月目は単純に問題を解いて、提出するということに課題を感じていましたが、C++にも少し慣れてきて、提出するまでの流れも覚えたので、簡単な問題はスムーズに解けるようになってきました。

前回一ヶ月経った時の記事を以下に貼っておきます。

私の場合、2ヶ月競技プログラミングに触れてきたこの時期に、やっと自分のわからないところが、わかるようになった。というイメージです。ちなみにここまでの2ヶ月の1日平均学習時間は1時間弱と言ったところです。

Ratingの上昇について

最初の最も簡単なA問題と次のB問題は、AC(正解のような判定)を獲得することができ、少しずつ実力が認められてきたのか、Ratingという数値も少しずつですが上昇してきました。

決して高い数値ではないので、公開するほどの事でもないのですが、自分の成長記録として残しておきます。このグラフは一見右肩上がりに成長できているように見えるかもしれませんが、感覚的には、自分の現在位置を知るための上昇値と言ったところでしょうか、まだ1度もレーティングは下がっていませんが、おそらくこの辺りが私の実力レベルだと認識しています。ざっくり言うとレート400には届かない数値です。

余談ですが、私はもともと「ストリートファイター」のような格闘ゲームや「スプラトゥーン」など、他人と対戦して自分のレーティングが上がるゲームが好きだったので、こういうグラフを見るとワクワクします。ちなみにそれらのゲームでも、レーティングはいつも下の方だった訳ですが。

ゲームをしていた時もそうですが、私は(すごい人からすると)あまり練習などせずにすぐに本番に向かい、ある程度レーティングを上げたら満足して、次のゲームに移行する感じで、1つのゲームをやりこむということはあまりありませんでした。そのことを考えると、こうして同じAtCoderに2ヶ月も触れているのは珍しい事だなぁと思っていたりします。ゲームに比べると練習量ははるかに低くなっているとも感じますが。

モチベーション維持が大変です。

こうして続けられている理由の1つは、仕事に繋がっていることがあげられるかなと思います。仕事関係の話が出来る友人などがいないので、AtCoderの話やアルゴリズムの話で盛り上がっているツイッターを見ながら、自分も高みを目指そうと思い少しずつ、細く長く(?)続けられているのだと思います。

先日、賞金が出るコンテストが行われていましたが、低レベルな私にとっては雲の上のお話なので、そういうものをモチベーションに変える事はできません。自分なりに毎日学習が続けられる環境づくりが大切だなぁとしみじみ思います。

これから必要になる知識の獲得

これまでは、先ほども記した通り、A問題やB問題のような比較的簡単な問題を解けるように、問題の読み解き方や、解答の提出方法について学んでいたイメージです。

これからは、C問題やD問題と、考えただけではすぐに解答を出すことが難しい問題に進んで行くのかなと思っており、それらに立ち向かう知識を獲得する必要があると考えています。

具体的には、初歩的なアルゴリズムの知識を深めて、問題を見た時にそれらの知識を使って解答できるようになるという事ができるようになる。というイメージです。(私の手元にある参考書によると、レベルの高い人はそういうイメージではないようです。)

今までのコンテストでも、たまにC問題を解答することが出来ていたのですが、ほとんど何もわからない状態から、1つ1つ丁寧に解答していったため、とても時間がかかり解答出来た時には、制限時間ギリギリということがほとんどでした。

そういった状況から、「この問題は、あの手法を使えば良い」と解答への筋道を立てる速度を高め、安定して解答することが必要だと考えています。

ここからやっと、これまで買って放置していたアルゴリズムに関する本が役立つ時かなと思っています。これまではほとんどの知識が、私には難しく感じていたので、まったく身についていませんでしたが、必要とあれば問題を解きながら、自分の物とすることができそうです。前まではしっかりと整えられていなかった解答するという土台もしっかり出来上がっていますし。

こうして勉強することで、今までお仕事として実装していたコーディングもよりよくなっていくと考えていますが、具体的にアルゴリズムを駆使するというよりは、いかに効率的に実装を進めていくかを、より柔軟に問題解決できるような思考を獲得していると言ったイメージです。

AtCoderに参加して思ったこと

2ヶ月目にして思う事は、「天狗になった自分の鼻を折る、素晴らしいツール」と捉えるようになりました。

自分が思いつく最適解が、全く最適ではない現状を目の当たりにしたり、解けないような問題がいくつも用意されているところに触れていると、少しコーディングが出来るようになっていた自分にとって、まだまだ解けない問題が山のようにあることがわかります。

便利な標準ライブラリや、フレームワークなどは偉大な先人が作ったもので、それを借りて少しコーディングしている自分は本当に無力な存在だと気づかされます。そうしてまたコツコツと勉強するモチベーションにもなっていると感じています。そんな私がプログラマーとして生きていけるのは周りの方の支えがあってこそだなぁと。ありがとうございます。

また、この1ヶ月間はほとんど勉強できていなかったなぁとも感じています。解答する環境を整えて、コードを上手く流せるようになった、という感じです。AtCoderの問題は、基本的にはその問題に対する解答方法を学ばなければ、解ける様にならないと考えて居ます。これはタイピングを早くできるようになるとか、数字の計算が早くできるようになるなどの問題ではなく、アルゴリズムをしっかいと学び使いこなせるようにならなければ、まったく先に進めないというイメージです。私はそのように考えていますので、C問題やD問題が解けないのは、そのしっかりと使いこなせるように勉強をしてこなかった、ということかなと思っています。

スキルアップについて思ったこと

プログラマーとしてのスキルアップに、私はアルゴリズムを選択している訳ですが、スキルアップできることは他にもたくさんあります。そんななか、こうして2ヶ月間をアルゴリズムに挑戦していると、学びの限界があるような気がしてきました。

これはネガティブな考えに捉えられてしまうかもしれませんが、例え100歳まで生きられるとしても、学びの時間は限られています。どのスキルにどのくらい時間をかけるべきなのか、または、どのスキルを諦めるべきなのか。こういう選択は非常に難しいと感じます。

二兎追う者は一兎も得ず、そんなイメージです。

はたから見れば、「アルゴリズムなんてほとんど役に立たないから他の事をやった方が良いよ」と思われることもあるかもしれません。確かにそうかもしれない・・・。と思わない訳でもないですが、どうしてなのかわかりませんが、私はこの「アルゴリズム」を今は最重要課題として捉えています。

(日本で仕事をしていくためには、それなりに資格取得とかも頑張った方が良いと思いますが。。)

そんなことを思うと、競技プログラミングを通じて頑張ってコンテストにチャレンジしている人に「どうしてアルゴリズムなのか?」という問いを投げかけてみたくなりますね。

まとめ

最後までお読み頂きありがとうございました。今回はAtCoderに参加して2ヶ月経った感想を記事にしてみました。

まだまだたった二ヶ月ですが、思う所はたくさんあります。コツコツと勉強していくことが、今は大切だと思っていますが、これから成長できるかは、自分の課題認識と学習の進め方によると感じています。

また1か月後に進捗報告できたら良いなと思っています。

それではまた次回もお会いできることを楽しみにしております。ありがとうございました。

この記事を書いた人

小幡 知弘

1990年茨城県神栖市生まれ
2013年大阪芸術大学卒業
Python×Webエンジニア