皆さんこんばんにちは、ユウです。
今回は、2019/10/19(土)受けたプログラミングコンテスト(競技プログラミング)の感想になります。
今回の記事は趣味記事なのでゆる~くいきたいと思います。
初めてのプログラミングコンテスト
今回私にとって初めてのプログラミングコンテストとなりました。
以前の記事で、プログラミングコンテストを薦めていたのですが、肝心の私が受けていなかったので今回受けてみました。
プログラミングコンテストはAtCoderさんのAtCoder Beginner Contest 143(ABC)を受けました。
アカウント登録は以前にメールアドレスから簡単にできていたので、後はコンテストに登録するだけでした。
コンテストに登録しておくのも簡単で、受けたいコンテスト画面まで行き登録ボタンを押すだけです。
時間が来ると自動でページが移動し、問題が公開されました。
AtCoderのコンテストの良いところとして、自宅で受けられるのはかなり良いですね。
また、時間帯も夜の9時からとかなので、昼忙しい人にも優しいスケジュールになっています。
コンテストの問題
夜の9時になるといよいよコンテストが始まったわけですが、このコンテストの問題は6問からなり、A,B,C,D,E,Fに分かれています。
Aが一番簡単で、それから順に難しくなっていきます。
配点も順に高くなっていきAが100点、Bが200点、・・・という風に順に高くなっていきます。
今回私はC++でコンテストを受けました。
C++の経験はあまりなく、3時間くらいで勉強した知識と、C言語の基礎知識で挑みました。
結果的に言うと、Aから順に進めていきCまでしか完答できませんでした。
もちろんプログラムは完答できていないと点数はもらえません。
Aの問題
カーテン2枚と窓があり、窓のカーテンにより閉められている部分を答えなさい、みたいな問題でした。
Aの問題は式の計算とデータの出力さえ理解しておけば、小学生でも解ける問題でした。
ですので、プログラミング初心者の方でも必ずAはクリアできます。
Bの問題
ある、K個のものから2個を選び、その平均をパターン全部に取っていくという問題でした。
Bの問題はfor文と配列を使う基本的な問題でした。
この問題も考えることができれば、基礎知識だけで答えられるものだったのでC言語だけでも一通り理解できておけば簡単に解ける問題でした。
Cの問題
ある、N個の文字数があり、そこにa~zをランダムが並べられて、同じ文字で隣り合うものは融合し1つになっていく。この際の最終的な文字の数を求めていく問題でした。
Cの問題は少しだけ考える必要がありましたが、for文とif文を上手くかみ合わせることができれば解けました。
解説を見るとC++は関数を使えば隣り合う要素のみを1つだけ残して消去する関数があるそうなのですが、この問題を解いていた時の私はそんなのはもちろん知らなかったのでごり押しで解いてしまいました。
今後は関数などもきちんと勉強していきたいと思います。
Dの問題
ある、M個の数が並べてありその中から三角形を作っていく際にできるパターンの合計を出す問題でした。
この問題も当然のようにごり押しで解いていたのですが、とにかく文がマどっろこしいものとなってしまいました。
if文とfor文が3重構造になってしまっていたんですね。
しかし、これをコンパイルすると、きちんと値が出て来てくれました。
それで、やったーと思いそのコードを出してみると、実行処理速度が規定に満たないとなってしまいました。
このプログラミングコンテストには、容量と実行処理速度が決められており、実行処理速度は2ms以内にしなければなりませんでした。
実行処理速度がなぜ、2msに満たなかったのかというとそれは、もちろん3重構造のせいではあるのですが、Mの数を見ていなかったこともあります。
Bの問題では2重構造をしていたのにもかかわらず、実行処理速度は規定の範囲にとどまりました。これはBの問題でKの最大値が100も無かったからです。
Dの問題では、このMの部分が1万とかそのくらい多かったのが原因でした。
この解法を見たのですが二分探索でかなりわかりやすいコードを掛けるという風に言われていたのですが、それを簡潔に行うには関数が必要でした。
もちろん、関数を使わない方法もあるにはあるのですがかなりめんどくさいことになってしまいます。
結果、Dの問題は最後まで実行処理速度を改善できず、未完で終わってしまいました。
最後に
今回はかなり悔しい思いをしてしまいました。
今後C++は関数についてかなり詳しくやっていくべきだなと感じました。
また、E問題の解説を見ているとアルゴリズムを使っていく問題でしたので、アルゴリズムにもそろそろ手を出していかないといけないなと強く感じました。
皆さんも自分の力を再認識できるので、ぜひプログラミングコンテストを受けてみてはどうでしょうか。
今回はこれで以上となります。
最後まで読んでいただきありがとうございました。