はじめまして!CREとしてエンジニアをやってますkazuです🦌
AtCoderの問題を2023年12月から解き始めて、2024年7月で300 問に達成したので、そこで気づいたことをいくつか共有しようと思います!
※Aの問題 200問
※Bの問題 100問
やり始めた経緯などについては、前回の記事があるので、気になる方はご覧ください✨
A問題との違い
- 複雑なデータ構造や多次元配列を扱う問題が多い
- 問題のステップ数が増えた
- 数学的知識の必要性
複雑なデータ構造や多次元配列を扱う問題が多い
A問題と比べると、B問題では複雑なデータ構造や多次元配列を扱う問題が増えているなと感じます。例えば、配列や連想配列のkeyとvalueを意識して値を格納し、それを効率的に操作する方法を考える必要があったり、思考の回数が明らかに増え、多くの変数を使用する必要性も出てきます。思考の回数が増えると、ステップも増えてしまうので必要であるか否かをより正確に考える必要があるなといった所感です。
問題のステップ数が増えた
上記と似た内容になるのですが、今までは
A → B(ゴール)
だったのが、
A → B → C(ゴール)
\ /
- B` -
と問題のステップ数が増えると同時に、処理のパターンも増えたといった印象です。
僕は最初に言語化をすることで、ステップごとの処理を考えるようにしています。言語化をするときのポイントとしては、最終的にどんな形でアウトプットを出したいのか目的から逆算して考えることを大事にしています。
基本的には、次のように進めています。
-
入力:
- どのようなデータが与えられるのかを確認
-
ブラックボックス(処理部分):
- 入力データをどのように処理するかを考える
- この部分では、値の扱い方や処理の流れを具体的に決める
-
出力:
- 最終的にどのような形で結果を出力するかを決める
アウトプットする形を決めることで、ブラックボックスでの値の扱い方も自ずと決まってきます。このプロセスを踏むことで、問題解決のための具体的なステップを明確にすることが徐々にできるようになってきました。
数学的知識の必要性
四則演算から始まり、整数と少数、最大公約数と最大公倍数、数列や図形(三角形、円)の性質や面積の求め方、2点間の距離の求め方やグラフ、論理演算など学生の時にやったような内容の問題がこの辺から出てきます。授業中に寝てる組としては、なかなかに辛い。
ですが、ちゃんと調べると理解もできるので一度やり方を理解してしまうと、そうでもないといった印象も受けました。
300問解いて得たこと
- 条件分岐とループだけで多様な処理を実現できること
- 間違いのある問題は、復習する時間を設けてやり直すことが大事
- 問題を解くためには、問題文を正確に理解する読解力が必要
条件分岐とループだけで多様な処理を実現できること
これはB問題を解いていく中で分かった事ですが、意外にも難しいアルゴリズムとか、特定の関数などを使用しなくても解ける問題が多いということに気づきました。つまり、自分がいつも使っている制御構文(条件分岐やループ処理など)などで、大体の問題は解けてしまうのです。問題をどう理解するか、アルゴリズムをどのように考えるか、それを処理にどう落とし込むか、B問題を通じてプログラミングの基本を学ぶことができました。B問題をコンスタントに解けるようになった頃には、実装力がかなり身についていると感じます。
間違いのある問題は、復習する時間を設けてやり直すことが大事
B問題を100問解いたのはいいのですが、大半は間違っている問題ばかり。AtCoderだけを勉強すればいいわけではないため、復習に当てる時間をなかなか取れなかったのが正直なところです。
過去の問題を解いてみても、解けるようになっている問題は少なく、結局自分ができる範囲の問題しか解いていないことに気づきました。そのため、復習する時間を設けることで、自分ができることを増やすことが大事であると感じます。
できることを増やすことが、「何もググらず即実装できる」になり、脳への負担を減らすことにもつながるので、少しずつ頑張りたいと思います。
※以下は牛尾さんが提唱している考え方
😩レベル4:自分では無理
😟レベル3:スパイクソリューションがあればなんとかなる
🙂レベル2:ググれば解決できる
😄レベル1:何もググらず即実装ができる
問題を解くためには、問題文を正確に理解する読解力が必要
エンジニアにとって問題解決力は必須スキルの一つですが、問題解決はそもそも問題を発見することから始まります。AtCoderの場合、問題はすでに提示されているので、その次のステップである「問題を理解する」というのが重要になってきます。
問題を理解するためには、センテンスごとに分解し、どういう文脈から成り立っているかを理解することが必要です。これにより、問題全体で何を求められているかがわかるようになります。
100問解いたことで少しずつ理解できるようになってきましたが、まだまだ読解に時間がかかりますし、理解できないことも多いです。今後の100問ではその点を意識しながら問題を解いていこうと思います。
まとめ
300問解いた事で、特別何かが変わった気はしませんが、B問題を普通に解けるくらいのレベルになった時、自分が積み上げたものの重さを知れる気がするので、まずはコツコツ目の前の1問1問に取り組んでいこうと思います💪