빙고는 NxN 크기의 게임 보드 칸에 1부터 NxN까지의 자연수를 중복 없이 하나씩 적은 후 숫자를 하나씩 지워나가는 게임입니다. 이때, 가로, 세로, 대각선 방향으로 한 줄에 적힌 숫자를 모두 지울 경우 빙고를 1개 만들었다고 합니다.

빙고 게임 보드에 적힌 숫자가 담겨있는 배열 board, 게임 보드에서 순서대로 지운 숫자가 들어있는 배열 nums가 매개변수로 주어질 때, board에서 nums에 들어있는 숫자를 모두 지우면 몇 개의 빙고가 만들어지는지 return하도록 solution함수를 완성해주세요.

제한사항

  • board는 게임 보드 칸에 적힌 숫자를 뜻하는 NxN크기의 2차원 배열이며, N은 2 이상 500이하의 자연수입니다.
  • board의 각 칸에는 1 이상 NxN이하의 자연수가 중복 없이 하나씩 들어있습니다.
  • nums는 board에서 지울 숫자가 들어있는 배열이며, 길이는 1 이상 NxN이하입니다.
  • nums에 들어있는 숫자는 1 이상 NxN이하의 자연수이며, 중복된 수가 들어있지 않습니다.

입출력 예

board nums result
[[11,13,15,16],[12,1,4,3],[10,2,7,8],[5,14,6,9]] [14,3,2,4,13,1,16,11,5,15] 3
[[6,15,17,14,23],[5,12,16,13,25],[21,4,2,1,22],[10,20,3,18,8],[11,9,19,24,7]] [15,7,2,25,9,16,12,18,5,4,10,13,20] 2

나의 풀이

def solution(board, nums):
    loc = {board[i][j]: [i,j] for i in range(len(board))
                              for j in range(len(board))}
    row_dict, col_dict = {}, {}
    right_cnt, left_cnt, bingo_cnt = 0, 0, 0
    for num in nums:
        row_key = loc[num][0]
        col_key = loc[num][1]
        if row_dict.get(row_key, -1) != -1:
            row_dict[row_key].append(col_key)
        else:
            row_dict[row_key] = [col_key]
        if col_dict.get(col_key, -1) != -1:
            col_dict[col_key].append(row_key)
        else:
            col_dict[col_key] = [row_key]
        if row_key == col_key:
            right_cnt += 1
            if right_cnt == len(board):
                bingo_cnt += 1
        if col_key == (len(board)-1-row_key):
            left_cnt += 1
            if left_cnt == len(board):
                bingo_cnt += 1
    values = list(row_dict.values()) + list(col_dict.values())
    for value in values:
        if len(value) == len(board):
            bingo_cnt += 1
    return bingo_cnt