AtCoder Beginner Contest

【pythonでABC157を解説】B - Bingo

問題概要

問題ページ

問題文

\(3\times3\) のサイズのビンゴカードがあります。上から \(i\) 行目、左から \(j\) 列目の数は \(A_{i, j}\) です。

続けて、 \(N\) 個の数 \(b_1, b_2, \cdots, b_N\) が選ばれます。選ばれた数がビンゴカードの中にあった場合、ビンゴカードのその数に印を付けます。

\(N\) 個の数字が選ばれた時点でビンゴが達成されているか、則ち、縦・横・斜めのいずれか \(1\) 列に並んだ \(3\) つの数の組であって、全てに印の付いているものが存在するかどうかを判定してください。

制約

  • 入力は全て整数
  • \(1 \leq A_{i, j} \leq 100\)
  • \(A_{i_1, j_1} \neq A_{i_2, j_2} ((i_1, j_1) \neq (i_2, j_2))\)
  • \(1 \leq N \leq 10\)
  • \(1 \leq b_i \leq 100\)
  • \(b_i \neq b_j (i \neq j)\)

問題の考察

この問題でビンゴするパターンは次の矢印の\(8\)パターンだけなので、全てのパターンをif文で場合分けすれば解答できる。

横・縦はfor文でコードを若干省略することができる。

ACコードでは横はif a[i][0] == a[i][1] == a[i][2] == -1:で、縦はelif a[0][i] == a[1][i] == a[2][i] == -1:で判定しているが、そもそもの場合分けのパターンが少ないので全てif文で書いても問題ない。

たびすけ
慣れていないと「問題の意味は分かるけど、コーディングで戸惑う問題の典型」なのでしっかりと復習しましょう!

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    a = [list(map(int, input().rstrip('\n').split())) for _ in range(3)]
    n = int(input().rstrip('\n'))
    for _ in range(n):
        b = int(input().rstrip('\n'))
        for i in range(3):
            for j in range(3):
                if a[i][j] == b:
                    a[i][j] = -1
    for i in range(3):
        if a[i][0] == a[i][1] == a[i][2] == -1:
            print("Yes")
            exit()
        elif a[0][i] == a[1][i] == a[2][i] == -1:
            print("Yes")
            exit()
    if a[0][0] == a[1][1] == a[2][2] == -1:
        print("Yes")
        exit()
    elif a[0][2] == a[1][1] == a[2][0] == -1:
        print("Yes")
        exit()
    print("No")


if __name__ == '__main__':
    solve()

-AtCoder Beginner Contest
-