(リベンジ)未経験からの競技プログラミング2周目

記事
IT・テクノロジー
うおおおお!

やるぞabc258!

今週もやりますAtCoderBeginnersContest(abc258)

この二週間はこの日のために生きてきたと言っても過言ではありません。

自分は書いて覚えたり考えたりする派なので


IMG_1890.jpg

こんな風にメソッドノートを作って覚えたり

実際にプログラミングする時にはノートに書き込んで考えたりしていました。

そのほかにも、アルゴリズムとか、高校時代に置いてきた数学の知識をインプットするために

図書館から本を引っ張り出してきて、計算をノートに書き散らす
そんな日々を送ってきました。

IMG_1892.jpg

気付いたら書き散らかされた裏紙がたくさん溜まっていました。

途中で腱鞘炎になって右手が使えなくなってしまったので、少し左手のパフォーマンスが向上したりもしました。

IMG_1893.jpg

今回は、すごく自信があります!

前回の、勉強して挑んだのに一問も解けなかった雪辱を晴らしてやろうと思います。



結果




スクリーンショット (15).png


一問正解でした


笑っちゃいますよね。


最初の、一番簡単な、A問題しか解けませんでした…

練習では、もっとできたんです

嘘じゃないです。

B問題までなら絶対に解けるというくらい、練習では本当に上手くいってたんです。

ですが、今回は本当にB問題の意味が分かりませんでした。


スクリーンショット (14).png


しばらく見て、ダメだと判断したので、すぐに次の問題であるC問題に挑んだのですが

C問題は、何回やっても実行制限オーバー(At Coderでは実行に2秒以上の時間を掛けてはいけない)で何度やってもクリアできずに

慌てて挑んだD問題も、クリアできるはずなく

あえなく一問正解でした。

どうして、こう上手くいかないのでしょうか。

このあと、ただでは転ぶまいと挑んだD問題も、+で1時間くらいかけても正解できませんでした。

ですが、後日解説を見て、B問題はマス目の全探索を行う典型的な問題であり、C問題も実行時間を圧倒的に短縮できる解法が紹介されていて、

自分の至らなさを痛感しました。

反省点としては、練習によって問題の読解力が上がったものの、そのまま工夫をせずに算数だけで解こうとしてしまう愚直な解法が癖になってしまっていたことです。

例えばC問題は

abcdef

という6つの単語からなる文字列が与えられたときに

末尾の文字を削除し、先頭に挿入するという動作をn回行う。

または、文字列のx 番目の文字を出力する。

のいずれかの処理が複数回行われ、x番目の文字を出力せよという問題だったのですが

この場合、後ろの文字が前に来る動作を行っているので、動作回数-n を 文字列の長さで割った余り、つまり

(-n % 文字列の長さ) = 先頭の文字

*負の値を割った余り % 演算子は後ろから数えた時の、残りの値を表示してくれる。
cf, -4 % 6 = 2 となり、これは、6個の要素を後ろから4番目まで数え上げた時、残っているのは2番目までの要素である。

-1 % 6 = 5
-2 % 6 = 4
-3 % 6 = 3
-6 % 6 = 0

これらを工夫して使えば、現時点の文字列のx 番目の文字を効率的に出力することができたのですが。

自分は、pop() メソッド *リストから要素を削除し抽出するメソッド や

insert() メソッド *リストの指定の位置をに要素を挿入するメソッド

などをわざわざ使って問題を解こうとしたので実行時間をオーバーしてしまい、クリアできませんでした。

大切なのは、無駄な処理をせず軽量化されたコードを実行することで、それらにはしっかりと工夫をこなせる知恵と機転が必要だと感じました。

またまた、残念な結果になってしまいましたが、簡単にはクリアできないからこそ競技プログラミングは楽しくて、奥が深いんだと思います。

挑戦するたびに知らない発見があってとても楽しいので、これからも続けていきます。

ここまで読んで下さり、本当にありがとうございました。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す