풀이


총 19가지 경우의 수를 가진 테트리스블록 모양의 좌표를 tet 라는 배열에 저장한다.

주어진 배열에서 각 좌표마다 19가지 테트리스블록의 합을 구하고 최댓값도 수정해준다.

IndexError 가 발생할 수 있으므로 예외처리를 통해 테트리스블록이 배열을 초과할 경우 continue 한다.

소스코드


import sys
 
input = sys.stdin.readline
 
N, M = map(int, input().split())
paper = [list(map(int, input().split())) for _ in range(N)]
tet = [
    [(0, 0), (0, 1), (0, 2), (0, 3)],  # 1자블록
    [(0, 0), (1, 0), (2, 0), (3, 0)],  # 1자블록
    [(0, 0), (0, 1), (1, 0), (1, 1)],  # 네모블록
    [(0, 0), (0, 1), (0, 2), (1, 0)],  # L자블록
    [(0, 2), (1, 0), (1, 1), (1, 2)],  # L자블록
    [(0, 0), (1, 0), (1, 1), (1, 2)],  # L자블록
    [(0, 0), (0, 1), (0, 2), (1, 2)],  # L자블록
    [(0, 0), (1, 0), (2, 0), (2, 1)],  # L자블록
    [(0, 1), (1, 1), (2, 1), (2, 0)],  # L자블록
    [(0, 0), (0, 1), (1, 0), (2, 0)],  # L자블록
    [(0, 0), (0, 1), (1, 1), (2, 1)],  # L자블록
    [(0, 1), (1, 0), (1, 1), (2, 0)],  # 계단블록
    [(0, 0), (1, 0), (1, 1), (2, 1)],  # 계단블록
    [(0, 1), (0, 2), (1, 0), (1, 1)],  # 계단블록
    [(0, 0), (0, 1), (1, 1), (1, 2)],  # 계단블록
    [(0, 0), (0, 1), (0, 2), (1, 1)],  # T자블록
    [(0, 1), (1, 0), (1, 1), (1, 2)],  # T자블록
    [(0, 0), (1, 0), (1, 1), (2, 0)],  # T자블록
    [(0, 1), (1, 0), (1, 1), (2, 1)],  # T자블록
]
 
 
def sol(x, y):
    global answer
    for i in range(19):
        result = 0
        for j in range(4):
            try:
                nx = x + tet[i][j][0]
                ny = y + tet[i][j][1]
                result += paper[nx][ny]
            except IndexError:
                continue
        answer = max(answer, result)
 
 
answer = 0
for i in range(N):
    for j in range(M):
        sol(i, j)
 
print(answer)

References