14500: 테트로미노

ewillwin·2023년 4월 8일
0

Problem Solving (BOJ)

목록 보기
10/230

  • 총 19가지의 테트로미노가 나옴
  • board에서 모든 칸을 순회하면서 19가지의 테트로미노의 경우를 모두 고려하여 최댓값을 구함 (brute force/ 500 500 19)
tmp = list(map(int, input().split(' ')))
N = tmp[0]; M = tmp[1]
board = []
for _ in range(N):
    board.append(list(map(int, input().split(' '))))

dshape = [
    [(0, 0), (0, 1), (0, 2), (0, 3)], #1
    [(0, 0), (1, 0), (2, 0), (3, 0)],
    [(0, 0), (0, 1), (1, 0), (1, 1)], #2
    [(0, 0), (1, 0), (2, 0), (2, 1)], #3
    [(0, 0), (1, 0), (0, 1), (0, 2)], 
    [(0, 0), (0, 1), (1, 1), (2, 1)],
    [(1, 0), (1, 1), (1, 2), (0, 2)],
    [(2, 0), (2, 1), (1, 1), (0, 1)],
    [(0, 0), (1, 0), (1, 1), (1, 2)],
    [(0, 0), (1, 0), (2, 0), (0, 1)],
    [(0, 0), (0, 1), (0, 2), (1, 2)],
    [(0, 0), (1, 0), (1, 1), (2, 1)], #4
    [(1, 0), (1, 1), (0, 1), (0, 2)],
    [(1, 0), (2, 0), (1, 1), (0, 1)],
    [(0, 0), (0, 1), (1, 1), (1, 2)],
    [(0, 0), (0, 1), (0, 2), (1, 1)], #5
    [(1, 0), (0, 1), (1, 1), (2, 1)],
    [(1, 0), (0, 1), (1, 1), (1, 2)],
    [(0, 0), (1, 0), (1, 1), (2, 0)],
]

def tetris(i, j):
    global result

    for x in range(19):
        local_result = 0
        for y in range(4):
            nx = i + dshape[x][y][0]; ny = j + dshape[x][y][1]
            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                break
            local_result += board[nx][ny]
        
        result = max(result, local_result)

result = 0
for i in range(N):
    for j in range(M):
        tetris(i, j)

print(result)
  • dshape 다차원 list를 정의하여 19가지의 테트로미노의 dx, dy를 저장함
  • 2중 for문을 돌며 모든 좌표에서 tetris(i, j)를 호출함
  • tetris(i, j)
    -> (i, j) 위치에서 dshape의 모든 dx, dy만큼 탐색하며 테트로미노가 놓인 칸에 쓰인 수들의 합을 구함
profile
Software Engineer @ LG Electronics

0개의 댓글