れとろのメモ置場

とあるSEのメモ置場

東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 307)

東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 307)に参加しました。

結果

A,B,Dの3問正解でした。

C問題が難しい…
言ってることは難しくないはずなのにコードで表現しようとするとうまくできなかった。

逆にD問題が簡単すぎな気がした。

A - Weekly Records

N週間分の歩数が与えられるので各週で合計何歩歩いたのかを順番に答える問題。

N週間分のループの中に7日分のループを置いて処理していった。
週の最初に歩数の合計をリセット、7日分のループの中で歩数を受け取って積み上げていく。7日分のループの後に積み上げた歩数を出力。

単純な入出力とループ処理を正しく実装できれば解ける問題。

B - racecar

2組の文字列を連結させて回分になるかどうかを判定する問題。

2重ループで全通りを試しつつ、 文字列の連結と回文の判定が正しく処理できれば解ける。

回分の判定は、連結した文字列のコピーを作ってreverseで逆順にしたものとコピー前の文字列が一致するかどうかで判定した。

C - Ideal Sheet

解いた中では1番難しかった。問題設定は単純で、透ける模様入りのシート2枚を重ねて指定された模様を作れるかどうかを判定する問題。

難しい部分としては2枚のシートのサイズと作りたい模様のサイズは一致しているとは限らないので単純に重ねるだけだと解けない。 2枚のシートをずらしながら重ね合わせないとだめだけど、その部分の実装がうまくできなかった。

コンテスト後にも少し解いてみてて、各シートのサイズは最大10マス分なのでそれよりも十分大きなシートに2枚それぞれをずらしながら置いてみるように実装してみたけど、今度は処理時間がかかりすぎてダメそうだった。

(追記)
改めて解き直してみたらなんとか解けた。 シートのサイズが最大10マスなので30×30のシートの中央に一方のシートを固定しつつ、もう一方のシートの置く位置をずらしながら作りたい模様になっているかどうかを判定してみた。
2枚それぞれをずらすなら2シート×置く位置の座標(2次元)で4重ループの探索になるけど、一方を固定するなら2重ループの探索で済ませられてそこそこ高速に処理できるようになった。

D - Mismatched Parentheses

()が含まれる文字列が与えられるので(・・・)の部分を順番に除外していくと最終的にどんな文字列になるのかを答える問題。

スタックを使って解けばすごく簡単な問題。正直C問題より遥かに簡単だった。
文字列を先頭から順番にスタックに入れつつ(の数をカウントしておく。)が出てきて、スタックに入っている(の数が1以上なら(が出てくるまでスタックの中身を取り出し続ける。文字列の最後まで処理が終われば、スタックの残りを使って文字列を作って出力する。