https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
주어진 mp를 돌면서 4개로 연결된 폴리오미노의 합중 가장 큰 합을 구해 출력하면 된다.
시간 초과를 막는 방법 : 가장 큰 값을 구해서 (가장 큰값 * (3-idx) ) + val 이 현재 답보다 작거나 같다면 return 한다.
'ㅗ'의 경우는 dfs로 찾을 수 없으므로
if idx ==1 : 을 따로 코드를 만들어 주어야한다.
코드 :
n,m = map(int,input().split())
mp = [list(map(int,input().split())) for _ in range(n)]
vis = [[0]*m for i in range(n)]
dx = [-1,0,1,0]
dy = [0,1,0,-1]
ans = 0
max_val = max(map(max,mp))
def dfs(i,j,idx,total) :
global ans
if ans >= total + max_val * (3-idx) :
return
if idx == 3 :
ans = max(ans,total)
return
else :
for k in range(4) :
nx = i + dx[k]
ny = j + dy[k]
if 0<=nx<n and 0<=ny<m and vis[nx][ny]==0 :
if idx == 1 : # 'ㅗ'모양을 위해 # ㅗ은 연달아 이을수 없다.
vis[nx][ny] = 1
dfs(i,j,idx+1, total + mp[nx][ny])
vis[nx][ny] = 0
vis[nx][ny] = 1
dfs(nx,ny,idx+1, total+mp[nx][ny])
vis[nx][ny] = 0
for i in range(n) :
for j in range(m) :
vis[i][j] = 1
dfs(i,j,0,mp[i][j])
vis[i][j] = 0
print(ans)
max_val을 구해서 시간초과를 막는다는 것이 신박하다.
왼쪽 그림은 idx == 1인 경우이다.
2번째까지 와서 세번째 값을 합한 후 다시 2번째자리로 돌아간다.
배운 점 :
1. 이차원 배열에서 최댓값을 구하는 방법
max(max(map))는 불가능 -!
max(map(max,map))을 통해 모든 원소에 대해서 비교가 가능하다 -!
참고 블로그 :
[파이썬]백준 14500 테트로미노
[파이썬]백준 14500 테트로미노
velog.io
https://cijbest.tistory.com/87
[백준 14500 : PYTHON] 테트로미노
문제 풀기 : 14500번 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두
cijbest.tistory.com
복습 :
✅ 20220701
✅ 20220913
🐾 20220916
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[삼성SW역량][Python/BOJ] 백준 14502 연구소(DFS+BFS) (0) | 2022.06.30 |
---|---|
[삼성SW역량][Python/BOJ] 백준 14501 퇴사(DFS) (0) | 2022.06.29 |
[삼성SW역량][Python/BOJ] 백준 13458 시험 감독(수학)풀이와 수정과정 (0) | 2022.02.10 |
[Python/BOJ] 백준 1753 최단경로(다익스트라) (0) | 2022.01.16 |
[Python/BOJ] 백준 14442 벽 부수고 이동하기2(BFS)-시간초과에서 삽질하다가 AC (3) | 2022.01.14 |