14500. 테트로미노 문제 바로가기
해결 방법
주어진 테트로미노에 대한 모든 회전과 대칭에 대한 위치를 tetromino
리스트에 저장한다.
주어진 종이 board
의 모든 위치에 가능한 tetromino
를 둔다.
- 이때 인덱스가 넘어갈 경우 놓인 칸의 합에 대한 비교를 하지 않도록
flag
변수를 두었다. - 인덱스가 넘어가지 않을 경우 최종 출력할
max_sum
변수와 비교하여 최대 합일 경우max_sum
변수에 저장한다.
구현한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
N, M = map(int, input().split())
tetromino = [
[[0, 0], [0, 1], [0, 2], [0, 3]], # 파란블록
[[0, 0], [1, 0], [2, 0], [3, 0]], # 파란블록 회전
[[0, 0], [0, 1], [1, 0], [1, 1]], # 노란블록
[[0, 0], [1, 0], [2, 0], [2, 1]], # 주황블록
[[0, 0], [0, 1], [0, 2], [-1, 2]], # 주황블록 회전
[[0, 0], [0, 1], [1, 1], [2, 1]], # 주황블록 회전
[[0, 0], [0, 1], [0, 2], [1, 0]], # 주황블록 회전
[[0, 0], [0, 1], [-1, 1], [-2, 1]], # 주황블록 대칭
[[0, 0], [0, 1], [0, 2], [1, 2]], # 주황블록 대칭 회전
[[0, 0], [0, 1], [1, 0], [2, 0]], # 주황블록 대칭 회전
[[0, 0], [1, 0], [1, 1], [1, 2]], # 주황블록 대칭 회전
[[0, 0], [1, 0], [1, 1], [2, 1]], # 초록블록
[[0, 0], [0, 1], [-1, 1], [-1, 2]], # 초록블록 회전
[[0, 0], [0, 1], [-1, 1], [1, 0]], # 초록블록 회전
[[0, 0], [0, 1], [1, 1], [1, 2]], # 초록블록 회전
[[0, 0], [0, 1], [0, 2], [1, 1]], # 핑크블록
[[0, 0], [1, 0], [2, 0], [1, 1]], # 핑크블록 회전
[[0, 0], [0, 1], [0, 2], [-1, 1]], # 핑크블록 회전
[[0, 0], [0, 1], [-1, 1], [1, 1]] # 핑크블록 회전
]
board = [list(map(int, input().split())) for _ in range(N)]
max_sum = 0
for y in range(N):
for x in range(M):
for tetro in tetromino: # 모든 위치 별로 tetromino 넣어보기
temp_sum = 0
flag = True
for t in range(len(tetro)):
ny, nx = y + tetro[t][0], x + tetro[t][1]
if 0 <= ny < N and 0 <= nx < M:
temp_sum += board[ny][nx]
else: # 해당 블록이 경계를 벗어나는 경우
flag = False
break
if flag and max_sum < temp_sum:
max_sum = temp_sum
print(max_sum)