14500 테트로미노

Kyung yup Lee·2021년 5월 28일
0

알고리즘

목록 보기
33/33

완전 브루트포스 문제.

풀이

모든 테트로미노 블록에 대해, 회전, 대칭으로 만들어지는 모든 경우의 수를 계산해서, 시작점에 대한 숫자합을 모두 계산해주면 풀 수 있다.

조금 더 효율적인 방법도 가능할 거 같아, 다른 방법도 시도해 볼만할 듯.

특히 배열로, 블록모양을 구현해, 주어진 배열을 순회할 수 있는 방법을 공부하면 더 가독성 높은 코드를 짤 수 있을 거라 생각한다.

코드


def solution():
    N, M = map(int, input().split(" "))
    board = [list(map(int, input().split(" "))) for _ in range(N)]
    answer = []

    def tetromino(x, y):
        answer = 0
        if x + 1 < M and x + 2 < M and x + 3 < M:  # 가로 네 줄
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y][x + 2] + board[y][x + 3])
        if y + 1 < N and y + 2 < N and y + 3 < N:  # 세로y 네 줄
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 2][x] + board[y + 3][x])
        if x + 1 < M and y + 1 < N:  # 네모난 모양
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y + 1][x] + board[y + 1][x + 1])

        if y + 1 < N and y + 2 < N and x + 1 < M:  # 세번째 노대칭
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 2][x] + board[y + 2][x + 1])
        if x + 1 < M and x + 2 < M and y - 1 >= 0:  # 세번째 오른쪽 회전
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y][x + 2] + board[y - 1][x+2])
        if y - 1 >= 0 and y - 2 >= 0 and x - 1 >= 0:  # 세번째 180도 회전
            answer = max(answer, board[y][x] + board[y - 1][x] + board[y - 2][x] + board[y - 2][x - 1])
        if x - 1 >= 0 and x - 2 >= 0 and y + 1 < N:  # 세번째 270도 회전
            answer = max(answer, board[y][x] + board[y][x - 1] + board[y][x - 2] + board[y + 1][x - 2])
        if y + 1 < N and y + 2 < N and x - 1 >= 0:  # 세번째 대칭
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 2][x] + board[y + 2][x - 1])
        if x - 1 >= 0 and x - 2 >= 0 and y - 1 >= 0:  # 세번째 대칭 왼쪽 회전
            answer = max(answer, board[y][x] + board[y][x - 1] + board[y][x - 2] + board[y - 1][x - 2])
        if y - 1 >= 0 and y - 2 >= 0 and x + 1 < M:  # 세번째 대칭 180도 회전
            answer = max(answer, board[y][x] + board[y - 1][x] + board[y - 2][x] + board[y - 2][x + 1])
        if x + 1 < M and x + 2 < M and y + 1 < N:  # 세번째 대칭 270도 회전
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y][x + 2] + board[y + 1][x + 2])

        if x + 1 < M and y + 2 < N:  # 네번쨰 꺼 노대칭
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 1][x + 1] + board[y + 2][x + 1])
        if x - 2 >= 0 and y + 1 < N:
            answer = max(answer, board[y][x] + board[y][x - 1] + board[y + 1][x - 1] + board[y + 1][x - 2])
        if x - 1 >= 0 and y - 2 >= 0:
            answer = max(answer, board[y][x] + board[y - 1][x] + board[y - 1][x - 1] + board[y - 2][x - 1])
        if x + 2 < M and y - 1 >= 0:
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y - 1][x + 1] + board[y - 1][x + 2])
        if x - 1 >= 0 and y + 2 < N:  # 네번째 꺼 대칭
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 1][x - 1] + board[y + 2][x - 1])
        if x - 2 >= 0 and y - 1 >= 0:
            answer = max(answer, board[y][x] + board[y][x - 1] + board[y - 1][x - 1] + board[y - 1][x - 2])
        if x + 1 < M and y - 2 >= 0:
            answer = max(answer, board[y][x] + board[y - 1][x] + board[y - 1][x + 1] + board[y - 2][x + 1])
        if x + 2 < M and y - 1 >= 0:
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y - 1][x + 1] + board[y - 1][x + 2])
        if x + 2 < M and y + 1 < N:  # 다섯번쨰 노대칭
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y + 1][x + 1] + board[y][x + 2])
        if x - 1 >= 0 and y + 2 < N:
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 1][x - 1] + board[y + 2][x])
        if x - 2 >= 0 and y - 1 >= 0:
            answer = max(answer, board[y][x] + board[y][x - 1] + board[y][x - 2] + board[y - 1][x - 1])
        if y - 2 >= 0 and x + 1 < M:
            answer = max(answer, board[y][x] + board[y - 1][x] + board[y - 1][x + 1] + board[y - 2][x])
        if x + 2 < M and y - 1 >= 0:  # 다섯번쨰 대칭
            answer = max(answer, board[y][x] + board[y][x + 1] + board[y - 1][x + 1] + board[y][x + 2])
        if y + 2 < N and x + 1 < M:
            answer = max(answer, board[y][x] + board[y + 1][x] + board[y + 1][x + 1] + board[y + 2][x])
        if x - 2 >= 0 and y + 1 < N:
            answer = max(answer, board[y][x] + board[y][x - 1] + board[y + 1][x - 1] + board[y][x - 2])
        if y - 2 >= 0 and x - 1 >= 0:
            answer = max(answer, board[y][x] + board[y - 1][x] + board[y - 1][x - 1] + board[y - 2][x])
        return answer

    for i in range(M):
        for j in range(N):
            answer.append(tetromino(i, j))

    return max(answer)


print(solution())
profile
성장하는 개발자

0개의 댓글