Algorithm(CodeTree, Python)/Simulation
[코드트리] 트로미노 Python
kurooru
2023. 1. 12. 11:59
# n, m 입력
n, m = map(int, input().split())
# grid 입력
grid = [
list(map(int, input().split()))
for _ in range(n)
]
# 함수들
# in_range_case_1(x, y)
def in_range_case_1(x, y):
# x는 n-1보다 작고, y는 m-1보다 작으면 통과
return x < n-1 and y < m-1
# get_case_1(x, y)
def get_case_1(x, y):
# 90도씩 돌린 4 가지 케이스를 전수조사
# sum_1
sum_1 = grid[x][y] + grid[x+1][y] + grid[x+1][y+1]
# sum_2
sum_2 = grid[x+1][y] + grid[x+1][y+1] + grid[x][y+1]
# sum_3
sum_3 = grid[x+1][y+1] + grid[x][y+1] + grid[x][y]
# sum_4
sum_4 = grid[x][y+1] + grid[x][y] + grid[x+1][y]
# 가장 큰 값을 반환
return max(sum_1, sum_2, sum_3, sum_4)
# in_range_case_2_row(x, y)
def in_range_case_2_row(x, y):
# y가 m-2보다 작으면 통과
return y < m-2
# get_case_2_row(x, y)
def get_case_2_row(x, y):
# 가로로 연속된 3개의 합을 반환
return grid[x][y] + grid[x][y+1] + grid[x][y+2]
# in_range_case_2_col(x, y)
def in_range_case_2_col(x, y):
# x가 n-2보다 작으면 통과
return x < n-2
# get_case_2_col(x, y)
def get_case_2_col(x, y):
# 세로로 연속된 3개의 합을 반환
return grid[x][y] + grid[x+1][y] + grid[x+2][y]
# 설계
# max_sum
max_sum = 0
# 완전 탐색 시작
for i in range(n):
for j in range(m):
# 첫 번째 경우에서 범위 내에 있으면
if in_range_case_1(i, j):
# max_sum update
max_sum = max(max_sum, get_case_1(i, j))
# 두 번째 경우 중 가로로 범위 내에 있으면
if in_range_case_2_row(i, j):
# max_sum update
max_sum = max(max_sum, get_case_2_row(i, j))
# 두 번째 경우 중 세로로 범위 내에 있으면
if in_range_case_2_col(i, j):
# max_sum update
max_sum = max(max_sum, get_case_2_col(i, j))
# 출력
print(max_sum)