초기 접근 _ 무지성 접근 (Brute_Force)

>> Base가 되는 테트로미노를 만들어 놓고 area(이차원 리스트)을 회전시켜 모든 경우의 수를 구한 후 max find

# Topic : Brute_Force  _ 테트로미노
#
# Python 3 : 3252ms
# PyPy 3 : 1316ms
# 무지성 비교

import sys

# 회전 알고리즘 
# >> 회전 후의 행번호 : 회전 전의 열번호
# >> 회전 후의 열번호 : N -1 - 회전전의 행번호
def rotate(area):
  X = len(area)
  Y = len(area[0])
  new_area = [[0] * X for _ in range(Y)]
  for x in range(X):
    for y in range(Y):
      new_area[y][X-1-x] = area[x][y]

  return new_area

# Base가 되는 테트로미노 비교
def tetro(area,result):
  X = len(area)
  Y = len(area[0])
   # 1. ----
  for i in range(X):
    for j in range(Y-3):
      results.append(sum(area[i][j:j+4]))

  # 2. ㅁ
  for i in range(X-1):
    for j in range(Y-1):
      results.append(sum(area[i][j:j+2]) + sum(area[i+1][j:j+2]))

  # 2-1. |__
  for i in range(X-1):
    for j in range(Y-2):
      results.append(area[i][j] + sum(area[i+1][j:j+3]))

  # 2-2. __|
  for i in range(X-1):
    for j in range(Y-2):
      results.append(area[i][j+2] + sum(area[i+1][j:j+3]))

  # 3-1. _|-
  for i in range(X-1):
    for j in range(Y-2):
      results.append(sum(area[i][j+1:j+3]) + sum(area[i+1][j:j+2]))

  # 3-1. -|_
  for i in range(X-1):
    for j in range(Y-2):
      results.append(sum(area[i][j:j+2]) + sum(area[i+1][j+1:j+3]))

  # 4. ㅗ
  for i in range(X-1):
    for j in range(Y-2):
      results.append(area[i][j+1] + sum(area[i+1][j:j+3]))

N, M = map(int,sys.stdin.readline().split())
area = [] # 입력되는 이차원 배열
results = [] # 테트로미노와 비교되는 결과값들

for _ in range(N):
  area.append(list(map(int,sys.stdin.readline().split())))

# 0. 그냥 
tetro(area,results)

# 1. 90도 회전
area = rotate(area)
tetro(area,results)

# 2. 180도 회전
area = rotate(area)
tetro(area,results)

# 3. 270도 회전
area = rotate(area)
tetro(area,results)

# print(results)
print(max(results))

조금 지성을 더한 접근 _ DFS 사용법

area의 특정 점을 기준으로 거리가 3인 DFS를 돌게되면 모든 모양(ㅗ의 경우 두번째 find에서 기존블록에서 탐색하게 만듬)을 만들 수 있으므로 이차원 리스트의 요소들을 돌면서 각각의 요소에서 거리가 3인 DFS를 수행한다... 근데 왜 잘 안될까,,,🤔

# Topic : Brute_Force  _ 테트로미노
#
# Python 3 :
# DFS 사용

import sys; 

# idx = 0, visit[n][m] = 1, total = '해당 요소값' 으로 시작 
def dfs(n, m, idx, total):
    global ans

    if idx == 3:
        ans = max(ans, total) # ans와 total을 비교하여 최신화
        return
    else:
        for i in range(4):
          # 움직인 다음 스텝(좌,하,우,상)
          next_n = n + dn[i]
          next_m = m + dm[i]
          try:
            if 0 <= next_n < N and 0 <= next_m < M and visit[next_n][next_m] == 0:  # next_n , next_c가 area 범위안에 있고 되돌아오는 방향이 아닌지 확인
                if idx == 1:  # ㅗ 모양을 위한 dfs
                  visit[next_n][next_m] = 1 # 접근 여부 체크 
                  dfs(n, m, idx + 1, total + area[next_n][next_m])  # ㅗ 모양은 두번째 탐색에서 첫번째 기준점에서 시작하여 탐색한다.
                  visit[next_n][next_m] = 0 # 다음 탐색을 위해 접근 여부 초기화
                visit[next_m][next_m] = 1 # 접근 여부 체크 
                dfs(next_n, next_m, idx + 1, total + area[next_n][next_m])  # 다음 블록을 기준점으로 탐색한다.
                visit[next_n][next_m] = 0 # 다음 탐색을 위해 접근 여부 초기화
          except:
            print("idx :",idx)
            print("next_n :",next_n)
            print("next_m :",next_m)

N, M = map(int,sys.stdin.readline().split())
area = []
for _ in range(N):
  area.append(list(map(int,sys.stdin.readline().split())))

print(area)

visit = [[0] * M for _ in range(N)]
print(visit)

dn = [-1, 0, 1, 0]
dm = [0, 1, 0, -1]
ans = 0
max_val = max(map(max, area))
for n in range(N):
    for m in range(M):
        visit[n][m] = 1 # 접근 여부 체크 
        dfs(n, m, 0, area[n][m])
        visit[n][m] = 0 # 다음 탐색을 위해 접근 여부 초기화

print(ans)