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

投稿日: 

Atcoder Python

B!
Daniel AgreloによるPixabay(https://pixabay.com/)からの画像

こんにちは, Shinoryoです.

今回は東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 307)を, Pythonで解いてみた結果を書き連ねていこうと思います.

A - Weekly Records

組み込み関数sum()を用いて計算することができます.

B - racecar

「$S_1$~$S_N$から2個($S_i$, $S_j$)選んで並べる順列」の全てに対してループさせて, それぞれで$S_i$と$S_j$をこの順に連結した文字列が回文となるかを調べればよいです. そのような順列を順番に取り出していくのには, itertools.permutationを使うと便利です.

C - Ideal Sheet

ここでは, シート$X$を切り出す範囲をあらかじめ決めておくことにします. 具体的には, シート$C$の座標$(0, 0)$から$(H_X - 1, W_X - 1)$の範囲を切り出すことにします. この切り出す範囲に対して, シート$A$とシート$B$をどのように配置するかを考えるのです.

高橋君が目標を達成できるシート$A$とシート$B$の配置は, 以下の3つの条件をすべて満たせばよいことが分かります.

  1. シート$X$の範囲に, シート$A$に存在する黒いマスが全て存在する.
  2. シート$X$の範囲に, シート$B$に存在する黒いマスが全て存在する.
  3. シート$X$の範囲の黒いマスが, 理想とするシート$X$の黒いマスと一致する.

シート自体は大きくないので, これを愚直に実装すればACとなります. CPython 3.11.4だと, 適切にbreakしないとTLEになる場合があります.

あるいは, シート$X$に余計な黒いマスがあっては条件を満たせないことから, 上記の条件は次のように書き換えられます.

  1. シート$A$の黒いマスは, 理想とするシート$X$の黒いマスに含まれる.
  2. シート$B$の黒いマスは, 理想とするシート$X$の黒いマスに含まれる.
  3. 理想とするシート$X$の黒いマスは, シート$A$またはシート$B$の黒いマスに含まれる.

黒いマスの位置をキャッシュしておくことで, さらに高速にこの問題を解くことができます.

なお, 上記のコードでは, 多重ループの記述に多重ループitertools.product()を使用しています.

D - Mismatched Parentheses

解説にもあるように, 「先頭から順に見て, )を見つけるたびに, 直前の(までを削除する」を実行すればよいです. 直前の「(」を覚えておくスタックや, 出力する文字列を記録しておくスタックは, Pythonではcollectionsモジュールのdeque型を用いれば簡単に実装できます.

E以降

E以降は私の能力不足故に省略いたします.

参考にしたサイト等

Search

About Me

自分の写真
理系大学生でした. Bloggerを利用して発信を行っています.

Labels