https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
처음 이 문제를 봤을때는 dfs(i,j,c,sums)에서 연산 횟수 c+1 , sums에 값을 더해주고 하고 c==4가 되는 경우의 sums를 모두 저장한 다음에 최댓값을 출력하는 함수로 만들었지만 예제 출력에도 한참이 걸렸고 그 이유가 중복되는 블록까지도 계속 더하고 연산하는 것을 발견해서 오래 걸린 것이라고 생각했다.
그래서 차라리 주어진 테트로미노가 나올 수 있는 모양을 일일이 구해서 그것만 dfs를 돌린다면 시간을 획기적으로 줄일 수 있겠다고 판단했고 나올 수 있는 모든 블럭의 경우의 수(19가지)를 구해서 dx dy 테크닉을 사용했다.
추가로 시간을 줄이기 위해 연산도중에 0~N과 0~M의범위를 벗어나면 바로 break를 걸어줬고 시간을 줄이기 위해 dx dy테크닉 배열에 절댓값이 큰 숫자부터 넣어줬다.
다음에는 다른 방법으로 한번 풀어봐야겠다.
++)대부분의 블럭을 4개의 방향으로 돌렸는데 저기 주황색 블럭은 대칭까지 포함해서 8개 종류가 나올 수 있다.
import sys
input = sys.stdin.readline
def dfs(i,j):
global count
for k in range(19):
kx = d2x[k]
ky = d2y[k]
counts =0
e = 0
for q in range(4):
nx = i+kx[q]
ny = j+ky[q]
if 0<=nx<n and 0<=ny<m:
counts+=s[nx][ny]
else:
e=1
break
if e==0:
count = max(count,counts)
d2x = [[0,0,0,0],[3,2,1,0],[1,1,0,0],[2,1,0,0],[0,0,0,1],[2,2,1,0],[-1,0,0,0],[2,1,1,0],[2,1,1,0],[1,1,0,0],[-1,-1,0,0],[0,1,0,0],[0,-1,0,0],[1,-1,0,0],[1,-1,0,0],[2,2,1,0],[-1,0,0,0],[-2,-2,-1,0],[1,0,0,0]]
d2y = [[3,2,1,0],[0,0,0,0],[1,0,1,0],[1,1,1,0],[2,1,0,0],[1,0,0,0],[2,2,1,0],[1,1,0,0],[-1,-1,0,0],[2,1,1,0],[2,1,1,0],[2,1,1,0],[2,1,1,0],[0,0,1,0],[0,0,-1,0],[-1,0,0,0],[-2,-2,-1,0],[1,0,0,0],[2,2,1,0]]
n,m = map(int,input().split())
s=[list(map(int,input().split())) for _ in range(n)]
vist = [[False]*m for _ in range(n)]
count = -1
for i in range(n):
for j in range(m):
dfs(i,j)
print(count)
도움이 되셨으면 공감 한번씩만 눌러주세요 로그인 필요 X
'백준 파이썬 코딩' 카테고리의 다른 글
백준 1987 알파벳 파이썬 (2) | 2022.08.13 |
---|---|
백준 2096 내려가기 파이썬 (0) | 2022.08.13 |
백준 1195 킥다운 파이썬 최적화 X (0) | 2022.08.12 |
백준 13398 연속합 2 파이썬 (0) | 2022.08.11 |
백준 25323 수 정렬하기, 근데 이제 제곱수를 곁들인 파이썬 (0) | 2022.08.11 |