AtCoder ABC 157 B – Bingo Python解説

スポンサーリンク

Bingo

3×3 のサイズのビンゴカードがあります。上から i 行目、左から j 列目の数は Ai,j です。
続けて、 N 個の数 b1​,b2​,⋯,bN が選ばれます。選ばれた数がビンゴカードの中にあった場合、ビンゴカードのその数に印を付けます。
N 個の数字が選ばれた時点でビンゴが達成されているか、則ち、縦・横・斜めのいずれか 1 列に並んだ 3 つの数の組であって、全てに印の付いているものが存在するかどうかを判定してください。

AtCoder Beginner Contest 「Bingo」

ビンゴが達成されているのかを判定する問題です。今回の問題では、ビンゴカードのサイズが3×3で固定されているので、ビンゴが成立するパターンは縦・横・斜めの合計8パターンです。

ですので、条件文を用いて縦・横・斜めでビンゴが成立しているか見ていきましょう。

a = [list(map(int, input().split())) for _ in range(3)]

n = int(input())

for _ in range(n):
    number = int(input())
    for i in range(3):
        for j in range(3):
            # (*1)
            if a[i][j] == number:
                a[i][j] = 0
                
flag = False

for i in range(3):  # 横の確認
    if a[i][0] + a[i][1] + a[i][2] == 0:
        flag = True
        
for i in range(3):  # 縦の確認
    if a[0][i] + a[1][i] + a[2][i] == 0:
        flag = True
        
if a[0][0] + a[1][1] + a[2][2] == 0: #斜めの確認
    flag = True
    
if a[0][2] + a[1][1] + a[2][0] == 0:
    flag = True
    
if flag:
    print("Yes")
else:
    print("No")

ビンゴカードの数字は2次元配列で受け取っています。
(*1)選ばれた数字がビンゴカードの中にあったら、ビンゴカードの数字を0に変更します。0に変更する理由はビンゴが成立しているか確認するのに便利だからです。

あとはビンゴが成立しているか見ていきましょう。確認方法は縦・横・斜めの数値を足したときに0になるかどうかです。そしてビンゴが成立したらflagをTrueにして出力して完了です。