まず初めに, この問題で出力すべき「初めてビンゴが成立したときにビンゴカードに開いている穴の総数」とは,
要するに「初めてビンゴが成立するのは何回目の数字の読み上げのときか」だと言い換えられます。
以下, 緩い制約から考えていきます。
のビンゴカードを模した二次元配列を用意し, 数字が読まれるたびに該当するマスに穴を開けていきます。
穴を開けるたびに「ビンゴが成立したか?」を確認します。
読まれた数字がどこのマスにあるかの確認や,
ビンゴ成立の確認は for 文でも実装できますが, 難しければ if 文を列挙してもよいでしょう。
のカードであれば, ビンゴが成立しうる方向は 本しかありません (タテ 本, ヨコ 本, ナナメ 本)。
だとビンゴが成立する方向は 本ありますから, if 文を列挙する訳にはいきません。
for 文でビンゴが成立する方向全てをチェックしてください。
ナナメの方向は多少頭を使いますが, いくつかの観察により
「左上から右下へのナナメ」に存在するマスは行と列のインデックスが等しいことや,
「左下から右上へのナナメ」に存在するマスは行と列のインデックスの和が になること(0-index)に気づきます。
最も愚直に実装すると, 読まれた数字の場所やビンゴ成立の確認に を要し,
これが数字の読み上げの回数分(高々回程度)繰り返されるので計算量は となります。
改善の余地はありますが, の制約においては高速に動作します。
「読まれた数字がどこのマスに存在するか?」と「ビンゴが成立しているか?」の確認を高速化します。
「読まれた数字がどこのマスに存在するか?」は, あらかじめ各数字の場所を記録しておくなどして,
読まれた数字の場所を で取得できるようにします。
「ビンゴが成立しているか?」の確認は,今開けたマスが含まれる行と列のみに着目すればよいことに気づけば で行えます。
さらに高速化するには各行と各列において開いたマスの個数を記録するカウンターを実装すれば です。
以上の方法を組み合わせると の解法になります。