본문 바로가기
ps

[백준] 14500 테르로미노

by FAPER 2024. 6. 9.

https://www.acmicpc.net/problem/14500

문제

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다.

  • 정사각형은 서로 겹치면 안 된다.
  • 도형은 모두 연결되어 있어야 한다.
  • 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다.

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

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

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

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

 

ㄴ, ㄹ, ㅜ  형태는 모두 2x3 또는 3x2 이므로 그냥 가능한 모든 경우의 수를 넣으면 된다.

범위 계산 해야하는데 귀찮아서 그냥 예외처리로 해결했다.

 

def type0(x,y): # 가로 4블럭
    sum = 0
    for i in range(x,x+1):
        for j in range(y,y+4):
            sum +=board[i][j]
    return sum
def type1(x,y): # 세로 4블럭
    sum = 0
    for i in range(x,x+4):
        for j in range(y,y+1):
           sum += board[i][j] 
    return sum

def type2(x,y): # 2x2 블럭 
    sum = 0
    for i in range(x,x+2):
        for j in range(y,y+2):
            sum += board[i][j]
    return sum
def type3(x,y): #3x2 블럭
    sum = 0
    for i in range(x,x+2):
        for j in range(y,y+3):
            sum += board[i][j]
    return max(sum - board[x][y] - board[x+1][y+2], sum - board[x+1][y] - board[x][y+2], 
               sum - board[x][y+1]- board[x][y+2], sum - board[x+1][y+1] - board[x+1][y+2],
               sum - board[x][y] -  board[x][y+2], sum - board[x+1][y] - board[x+1][y+2],
               sum - board[x][y] - board[x][y+1], sum- board[x+1][y] - board[x+1][y+1])

def type4(x,y): # 2x3 블럭
    sum = 0
    for i in range(x,x+3):
        for j in range(y,y+2):
            sum += board[i][j]
    return max(sum - board[x][y] - board[x+2][y+1], sum - board[x][y+1] - board[x+2][y],
               sum - board[x][y] - board[x+1][y], sum - board[x][y+1]- board[x+1][y+1],
               sum - board[x+1][y+1] - board[x+2][y+1] , sum - board[x+1][y] - board[x+2][y],
               sum - board[x][y] - board[x+2][y], sum - board[x][y+1] - board[x+2][y+1])

N,M = map(int, input().split())
board = []
for i in range(N):
    board.append(list(map(int, input().split(" "))))
ans = 0
for i in range(N):
    for j in range(M):
        try:
            ans = max(type0(i,j),ans)
        except:
            pass
        try:
            ans = max(type1(i,j),ans)
        except:
            pass
        try:
            ans = max(type2(i,j),ans)
        except:
            pass
        try:
            ans = max(type3(i,j),ans)
        except:
            pass
        try:
            ans = max(type4(i,j),ans)
        except:
            pass


print(ans)

 

좀 더 최적화가 필요 해 보인다.