|
| 1 | +''' |
| 2 | +1. 완전 탐색으로 진행 |
| 3 | + 1.1 문제 요건에 따라 최악의 경우는 |
| 4 | + 500 * 500 * 5(테트로미노 종류) * 4(90도 회전 경우의 수) * 4(대칭한 후 90도 회전 경우의 수). |
| 5 | + N(1억)이 1초라고 가정한다면 2초면 충분하다고 판단. |
| 6 | +2. 테트로미노의 종류별로, 회전과 대칭의 경우의 수를 모두 고려하여 모양 리스트를 만든다. |
| 7 | +3. 이중 반복문에서 모든 칸을 순회하며 모든 모양 리스트를 검사하여 최댓값을 찾는다. |
| 8 | +
|
| 9 | +''' |
| 10 | + |
| 11 | +N, M = map(int, input().split()) |
| 12 | + |
| 13 | +arr = [list(map(int, input().split())) for _ in range(N)] |
| 14 | + |
| 15 | +# 가능한 모든 테트로미노 모양, 시작점을 기준으로 더해야 할 dx, dy임. |
| 16 | +shape = [[(0, 1), (0, 2), (0, 3)], [(1, 0), (2, 0), (3, 0)], |
| 17 | + [(0, 1), (1, 0), (1, 1)], |
| 18 | + [(1, 0), (1, 1), (2, 1)], [(0, -1), (1, -1), (1, -2)], |
| 19 | + [(1, 0), (1, -1), (2, -1)], [(0, 1), (1, 1), (1, 2)], |
| 20 | + [(1, 0), (2, 0), (2, 1)], [(0, 1), (0, 2), (1, 0)], |
| 21 | + [(0, 1), (1, 1), (2, 1)], [(0, 1), (0, 2), (-1, 2)], |
| 22 | + [(1, 0), (2, 0), (2, -1)], [(0, 1), (0, 2), (1, 2)], |
| 23 | + [(1, 0), (2, 0), (0, 1)], [(1, 0), (1, 1), (1, 2)], |
| 24 | + [(1, 0), (1, 1), (1, -1)], [(1, 0), (1, 1), (2, 0)], |
| 25 | + [(0, -1), (1, 0), (0, 1)], [(0, 1), (-1, 1), (1, 1)] |
| 26 | + ] |
| 27 | + |
| 28 | + |
| 29 | +def calc(i, j, tet): |
| 30 | + sum = arr[i][j] |
| 31 | + for dx, dy in tet: |
| 32 | + newX = i + dx |
| 33 | + newY = j + dy |
| 34 | + #종이의 범위를 넘지 않았다면 종이 칸의 수 더하기 |
| 35 | + if 0 <= newX < N and 0 <= newY < M: |
| 36 | + sum += arr[newX][newY] |
| 37 | + else: |
| 38 | + return 0 |
| 39 | + return sum |
| 40 | + |
| 41 | + |
| 42 | +ans = 0 |
| 43 | +for i in range(N): |
| 44 | + for j in range(M): |
| 45 | + for tet in shape: |
| 46 | + temp = calc(i, j, tet) # 현재 위치에서 가능한 모든 모양의 합 계산 |
| 47 | + ans = max(temp, ans) |
| 48 | + |
| 49 | +print(ans) |
0 commit comments