Algorithm/📊 Problem Solving

[백준/BOJ] 14500 - 테트로미노

posted by sangmin

14500 - 테트로미노

문제

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다.
- 정사각형은 서로 겹치면 안 된다.
- 도형은 모두 연결되어 있어야 한다.
- 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다.

정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다.

image

아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다.

테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오.

테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며, 회전이나 대칭을 시켜도 된다.

코드

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]

result = []
for i in range(N):
    for j in range(M):
        # ㅁㅁㅁㅁ
        if i < N and j+3 < M:
            result.append(sum(graph[i][j:j+4]))
        if i+3 < N and j < M:
            result.append(graph[i][j] + graph[i+1][j] + graph[i+2][j] + graph[i+3][j])

        # ㅁㅁ
        # ㅁㅁ
        if i+1 < N and j+1 < M:
            result.append(sum(graph[i][j:j+2]) + sum(graph[i+1][j:j+2]))

        # ㅁ
        # ㅁ
        # ㅁㅁ
        if i+2 < N and j+1 < M:
            result.append(graph[i][j] + graph[i+1][j] + graph[i+2][j] + graph[i+2][j+1])
            result.append(graph[i][j+1] + graph[i+1][j+1] + graph[i+2][j] + graph[i+2][j+1])
            result.append(graph[i][j] + graph[i][j+1] + graph[i+1][j] + graph[i+2][j])
            result.append(graph[i][j] + graph[i][j+1] + graph[i+1][j+1] + graph[i+2][j+1])

        # ㅁ
        # ㅁㅁ
        #   ㅁ
            result.append(graph[i][j] + graph[i+1][j] + graph[i+1][j+1] + graph[i+2][j+1])
            result.append(graph[i][j+1] + graph[i+1][j] + graph[i+1][j+1] + graph[i+2][j])

        # ㅁ
        # ㅁㅁ
        # ㅁ
            result.append(graph[i][j] + graph[i+1][j] + graph[i+1][j+1] + graph[i+2][j])
            result.append(graph[i][j+1] + graph[i+1][j] + graph[i+1][j+1] + graph[i+2][j+1])

        # ㅁㅁㅁ
        # ㅁ
        if i+1 < N and j+2 < M:
            result.append(graph[i][j] + graph[i][j+1] + graph[i][j+2] + graph[i+1][j])
            result.append(graph[i][j] + graph[i][j+1] + graph[i][j+2] + graph[i+1][j+2])
            result.append(graph[i][j] + graph[i+1][j] + graph[i+1][j+1] + graph[i+1][j+2])
            result.append(graph[i][j+2] + graph[i+1][j] + graph[i+1][j+1] + graph[i+1][j+2])

        #   ㅁㅁ
        # ㅁㅁ
            result.append(graph[i][j+1] + graph[i][j+2] + graph[i+1][j] + graph[i+1][j+1])
            result.append(graph[i][j] + graph[i][j+1] + graph[i+1][j+1] + graph[i+1][j+2])

        #   ㅁ
        # ㅁㅁㅁ
            result.append(graph[i][j+1] + graph[i+1][j] + graph[i+1][j+1] + graph[i+1][j+2])
            result.append(graph[i][j] + graph[i][j+1] + graph[i][j+2] + graph[i+1][j+1])

print(max(result))

한마디

시간초과 뜨지 않을 것 같아서 브루트 포스로 만들 수 있는 모든 도형을 계산해주었다.

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

 

'Algorithm > 📊 Problem Solving' 카테고리의 다른 글

[백준/BOJ] 3184 - 양  (0) 2021.01.20
[백준/BOJ] 1837 - 암호제작  (0) 2021.01.20
[백준/BOJ] 11403 - 경로 찾기  (0) 2021.01.19
[백준/BOJ] 1600 - 말이 되고픈 원숭이  (0) 2021.01.19
[백준/BOJ] 5430 - AC  (0) 2021.01.16