삼성 기출이다!
문제를 읽자마자 어떻게 하면 되겠다 바로 생각이들어서
쭉 코드를 쓰기 시작했다.
별다른 알고리즘을 적용할게 없고 그냥 단순구현문제라고 생각된다.
지도의 좌표를 for문으로 쭉 돌리면서 해당 점을 기준으로 주어진 5개의 모양을 만들었을때 모든 사각형이 지도 안에 들어오는지 여부를 체크해서 모든 점이 들어온다면 최대값의 후보로 배열에 넣어주고, 모든 모양에 대한 탐색이 끝난 후 배열에 저장된 값 중에 최대값을 출력해주는 식으로 짜주었다.
n,m = map(int,input().split())
back = [list(map(int,input().split())) for _ in range(n)]
arr = []
def mapcheck(y,x):
global n,m
if y < 0 or x < 0 or y >=n or x >=m:
return False
return True
def shape1(y,x):
global arr
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y,x+2) and mapcheck(y,x+3):
arr.append(back[y][x] + back[y][x+1] + back[y][x+2] + back[y][x+3])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+2,x) and mapcheck(y+3,x):
arr.append(back[y][x] + back[y+1][x] + back[y+2][x] + back[y+3][x])
def shape2(y,x):
global arr
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y+1,x) and mapcheck(y+1,x+1):
arr.append(back[y][x] + back[y][x+1] + back[y+1][x] + back[y+1][x+1])
def shape3(y,x):
global arr
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+2,x) and mapcheck(y+2,x+1):
arr.append(back[y][x] + back[y+1][x] + back[y+2][x] + back[y+2][x+1])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y,x+2) and mapcheck(y-1,x+2):
arr.append(back[y][x] + back[y][x+1] + back[y][x+2] + back[y-1][x+2])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y+1,x+1) and mapcheck(y+2,x+1):
arr.append(back[y][x] + back[y][x+1] + back[y+1][x+1] + back[y+2][x+1])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+1,x+1) and mapcheck(y+1,x+2):
arr.append(back[y][x] + back[y+1][x] + back[y+1][x+1] + back[y+1][x+2])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y-1,x+1) and mapcheck(y-2,x+1):
arr.append(back[y][x] + back[y][x+1] + back[y-1][x+1] + back[y-2][x+1])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y,x+2) and mapcheck(y+1,x+2):
arr.append(back[y][x] + back[y][x+1] + back[y][x+2] + back[y+1][x+2])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y+1,x) and mapcheck(y+2,x):
arr.append(back[y][x] + back[y][x+1] + back[y+1][x] + back[y+2][x])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y,x+1) and mapcheck(y,x+2):
arr.append(back[y][x] + back[y+1][x] + back[y][x+1] + back[y][x+2])
def shape4(y,x):
global arr
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+1,x+1) and mapcheck(y+2,x+1):
arr.append(back[y][x] + back[y+1][x] + back[y+1][x+1] + back[y+2][x+1])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y-1,x+1) and mapcheck(y-1,x+2):
arr.append(back[y][x] + back[y][x+1] + back[y-1][x+1] + back[y-1][x+2])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+1,x-1) and mapcheck(y+2,x-1):
arr.append(back[y][x] + back[y+1][x] + back[y+1][x-1] + back[y+2][x-1])
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y+1,x+1) and mapcheck(y+1,x+2):
arr.append(back[y][x] + back[y][x+1] + back[y+1][x+1] + back[y+1][x+2])
def shape5(y,x):
global arr
if mapcheck(y,x) and mapcheck(y,x+1) and mapcheck(y+1,x+1) and mapcheck(y,x+2):
arr.append(back[y][x] + back[y][x+1] + back[y+1][x+1] + back[y][x+2])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+1,x+1) and mapcheck(y+2,x):
arr.append(back[y][x] + back[y+1][x] + back[y+1][x+1] + back[y+2][x])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+1,x-1) and mapcheck(y+1,x+1):
arr.append(back[y][x] + back[y+1][x] + back[y+1][x-1] + back[y+1][x+1])
if mapcheck(y,x) and mapcheck(y+1,x) and mapcheck(y+1,x-1) and mapcheck(y+2,x):
arr.append(back[y][x] + back[y+1][x] + back[y+1][x-1] + back[y+2][x])
for i in range(n):
for j in range(m):
shape1(i,j)
shape2(i,j)
shape3(i,j)
shape4(i,j)
shape5(i,j)
print(max(arr))
각 모양을 회전시키거나 뒤집을수 있다는걸 빼먹고 너무 쉬운데? 하고 했다가 다 짜고나서 다시 읽어보니 회전이나 뒤집기 가능이라서 해당 케이스들도 다 고려해서 코드를 추가해주었다.
빠트린게 있나 그려가면서 하나씩 따져봤다.
저 모양 3번이 지옥이었다 ㅠㅠ
풀이시간은 총 30~40분? 정도는 걸린것같은데
아이디어는 아주 간단한데
정말 노가다 식으로 구현하는 코드만 쓰는데 이정도의 시간이 걸렸다
특히 shape3 녀석..
삼성 sw테스트가 3시간에 2문제인걸 고려하면 나름 괜찮게 푼것같다
다시한번 느끼지만 삼성문제는 정말 구현구현 한게 많은 것 같다
끝!