케이스 바이 케이스로 총 19개가 나온다. 하나씩 코드를 적기는 너무 소모적이라 그나마 공통적이라 판단되는 블록의 공통 개수를 카운트, 하나씩 블록을 추가해가면서 로컬 최댓값을 구했다. 물론 이때 인덱싱 관련 문제로 인해 다소 헤맸다.
import sys
n, m = map(int, sys.stdin.readline().rstrip().split())
nodes = [[] for _ in range(n)]
for i in range(n):
nodes[i] += list(map(int, sys.stdin.readline().rstrip().split()))
blk_size = 0
for i in range(n):
for j in range(m):
# case1: --- 세 개 가로 구하고 각 구간에 한 개씩 블록을 한 개씩 붙인다.
if j + 2 < m:
block = nodes[i][j] + nodes[i][j+1] + nodes[i][j+2]
if j + 3 < m: blk_size = max(blk_size, block+nodes[i][j+3])
if i - 1 >= 0:
blk_size = max(blk_size, block+nodes[i-1][j])
blk_size = max(blk_size, block + nodes[i-1][j+1])
blk_size = max(blk_size, block + nodes[i-1][j+2])
if i + 1 < n:
blk_size = max(blk_size, block+nodes[i+1][j])
blk_size = max(blk_size, block+nodes[i+1][j+1])
blk_size = max(blk_size, block+nodes[i+1][j+2])
# case2: | 세로로 세 개 구하고 각 구간에 하나씩 블록 붙인다.
if i + 2 < n:
block = nodes[i][j] + nodes[i+1][j] + nodes[i+2][j]
if i + 3 < n:
blk_size = max(blk_size, block+nodes[i+3][j])
if j - 1 >= 0:
blk_size = max(blk_size, block+nodes[i][j-1])
blk_size = max(blk_size, block + nodes[i+1][j - 1])
blk_size = max(blk_size, block + nodes[i+2][j - 1])
if j + 1 < m:
blk_size = max(blk_size, block + nodes[i][j+1])
blk_size = max(blk_size, block + nodes[i+1][j + 1])
blk_size = max(blk_size, block + nodes[i+2][j + 1])
#case3: -- 두 개 구하고 두 개 붙인다.
if j + 1 < m:
block = nodes[i][j] + nodes[i][j+1]
if i+1 < n:
blk_size = max(blk_size, block+nodes[i+1][j]+nodes[i+1][j+1])
if j-1 >=0:
blk_size = max(blk_size, block+nodes[i+1][j-1] + nodes[i+1][j])
if j+2 < m:
blk_size = max(blk_size, block+nodes[i+1][j+1]+nodes[i+1][j+2])
if i-1>=0:
blk_size = max(blk_size, block+nodes[i-1][j]+nodes[i+1][j+1])
blk_size = max(blk_size, block+nodes[i-1][j+1]+nodes[i+1][j])
print(blk_size)