728x90
반응형
https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
구현은 아이디어만 떠올린다면 나머지는 코드를 적는 시간과의 싸움이다.
구현을 일종의 수준 높은 하드코딩이라고 부를 수도 있다. 물론 더 멋지고 이쁘게 푸는 방법이 있을 수 도 있다.
그러나 구현 문제는 단순하게 '구현' 하는 것이 목표다. 아이디어를 잘 떠올릴 수 있도록 똑똑하거나 다양한 구현 문제에 익숙해지는 게 좋다.
import sys
n,m = map(int,sys.stdin.readline().split())
arr = []
for _ in range(n):
arr.append(list(map(int,sys.stdin.readline().split())))
ans = 0
def check(x,y):
global ans
#1번 가로
if y+3 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x][y+2] + arr[x][y+3]
if tmp > ans:
ans = tmp
#1번 세로
if x+3 < n:
tmp = arr[x][y] + arr[x+1][y] + arr[x+2][y] + arr[x+3][y]
if tmp > ans:
ans = tmp
#2번
if x+1 < n and y+1 < m:
tmp = arr[x][y] + arr[x+1][y] + arr[x][y+1] + arr[x+1][y+1]
if tmp > ans:
ans = tmp
#3번 0도
if x+2 < n and y+1 < m:
tmp = arr[x][y] + arr[x+1][y] + arr[x+2][y] + arr[x+2][y+1]
if tmp > ans:
ans = tmp
#3번 0도 대칭
if x-2 >=0 and y+1 <m:
tmp = arr[x][y] + arr[x][y+1] + arr[x-1][y+1] + arr[x-2][y+1]
if tmp > ans:
ans = tmp
#3번 90도
if x+1 < n and y+2 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x][y+2] + arr[x+1][y]
if tmp > ans:
ans = tmp
#3번 90도 대칭
if x+1 < n and y+2 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x][y+2] + arr[x+1][y+2]
if tmp > ans:
ans = tmp
#3번 180도
if x+2 < n and y+1 <m:
tmp = arr[x][y] + arr[x][y+1] + arr[x+1][y+1] + arr[x+2][y+1]
if tmp > ans:
ans = tmp
#3번 180도 대칭
if x+2 < n and y+1 < m:
tmp = arr[x][y] + arr[x+1][y] + arr[x+2][y] + arr[x][y+1]
if tmp > ans:
ans = tmp
#3번 270도
if x - 1 >= 0 and y + 2 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x][y+2] + arr[x-1][y+2]
if tmp > ans:
ans = tmp
#3번 270도 대칭
if x+1 < n and y+2 < m:
tmp = arr[x][y] + arr[x+1][y] + arr[x+1][y+1] + arr[x+1][y+2]
if tmp > ans:
ans = tmp
#4번 0도
if x+2 < n and y+1 < m:
tmp = arr[x][y] + arr[x+1][y] + arr[x+1][y+1] + arr[x+2][y+1]
if tmp > ans:
ans = tmp
#4번 0도 대칭
if x + 2 < n and y-1 >=0:
tmp = arr[x][y] + arr[x+1][y] + arr[x+1][y-1] + arr[x+2][y-1]
if tmp > ans:
ans = tmp
#4번 90도
if x-1 >= 0 and y + 2 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x-1][y+1] + arr[x-1][y+2]
if tmp > ans:
ans = tmp
#4번 90도 대칭
if x + 1< n and y+2 <m:
tmp = arr[x][y] + arr[x][y+1] + arr[x+1][y+1] + arr[x+1][y+2]
if tmp > ans:
ans = tmp
#5번 0도
if x+1 < n and y+2 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x][y+2] + arr[x+1][y+1]
if tmp > ans:
ans = tmp
# 5번 90도
if x+2 < n and y-1 >=0:
tmp = arr[x][y] + arr[x+1][y] + arr[x+2][y] + arr[x+1][y-1]
if tmp > ans:
ans = tmp
#5번 180도
if x-1 >=0 and y+2 < m:
tmp = arr[x][y] + arr[x][y+1] + arr[x][y+2] + arr[x-1][y+1]
if tmp > ans:
ans = tmp
#5번 270도
if x+2 < n and y+1 <m:
tmp = arr[x][y]+ arr[x+1][y] + arr[x+2][y] + arr[x+1][y+1]
if tmp > ans:
ans = tmp
for i in range(n):
for j in range(m):
check(i,j)
print(ans)
각 회전 했을 때의 테트로미노의 모양과 대칭했을 때의 모양도 고려해줘야 한다.
총 각 포인트당 19개의 경우의 수가 있다.
따라서 위처럼 브루트포스로 전부 구현해주면 n*m*19번의 연산으로 값을 찾을 수 있다.
주어진 배열을 전부 탐색하면서 조건에 해당하면 찾아보면 된다.
만약에 조건에 만족하는 값들의 합이 ans보다 크다면 ans 값을 교체해준다.
최종적으로 남는 ans값이 최댓값이다.
728x90
반응형
'Algorithm & Data Structure' 카테고리의 다른 글
백준 - 9663번(백트래킹, N-Queen) (0) | 2022.08.15 |
---|---|
백준 - 2638번(BFS,구현) (0) | 2022.08.14 |
백준 - 12738(DP,LIS,이분탐색,bisect) (0) | 2022.08.14 |
백준 - 2565번(DP,BFS) (0) | 2022.08.13 |
백준 - 2225번(DP) (0) | 2022.08.12 |