알고리즘/Python

[백준] 14500 - 테트로미노

9__bin 2023. 7. 20. 19:05

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

문제 한줄 이해

-5가지 테트리스에서 사용되는 모양들을 그래프에 위치 시켰을때 놓여진 부분들의 합이 제일 큰경우를 구하기

 

생각난 풀이

1번째 방법: 먼저 도형들의 규칙성을 찾으려고 노력했다. 각 점의 기준에서 상하좌우로 움직이면서 DFS로 탐색을 진행하면 원하는 모양을 만들 수 있는 것이다! 근데 ㅜ 이 모양은 DFS로 탐색을 진행한다고 해서 만들어 질 수 없는 모양이라 따로 처리를 해줘야한다고 생각했지만 좋은 방법이 떠오르지 않았다.

그래서 검색을 통해 힌트를 얻었는데 격자가 2개가 이어 붙여진 상태에서 다음 탐색을 할때 다음 좌표를 넘기는게 아닌 현재의 좌표를 넘겨주는 조건을 거는거다.

이유는 천천히 재귀를 따라가보면 알 수 있다.

2개가 이어진 상태에서 다음으로 탐색할 좌표를 True로 표시하고 현재 자리를 넘겨 준다면 total값에는 ㅡ 모양의 값이 담겨 있고

이때 탐색하지 않은 위 아래 를 탐색하면서 자연스럽게 ㅜ ㅗ ㅓ ㅏ등의 모양을 만들 수 있는 것이다.

import sys
n, m = map(int,sys.stdin.readline().split())

graph = []

for i in range(n):
    graph.append(list(map(int,sys.stdin.readline().split())))
            
def dfs(x,y,cnt,total):
    global result
    if cnt == 4:
        if result < total:
            result = total
        return
    dx = [0,0,1,-1]
    dy = [1,-1,0,0]
    
    for i in range(4):
        nextx = dx[i] + x
        nexty = dy[i] + y
        if nextx>= 0 and nexty>=0 and nextx<=n-1 and nexty<=m-1:
            if visited[nextx][nexty] == False:
                if cnt == 2:
                    visited[nextx][nexty] = True
                    //현재 위치를 넘기기 단, total은 다음 좌표값을 더해서
                    dfs(x,y,cnt+1,total+graph[nextx][nexty])
                    visited[nextx][nexty] = False

                visited[nextx][nexty] = True
                dfs(nextx,nexty,cnt+1,total+graph[nextx][nexty])
                visited[nextx][nexty] = False
result = 0
visited = [[False for i in range(m)] for i in range(n)]
for i in range(n):
    for j in range(m):
        visited[i][j] =True
        dfs(i,j,1,graph[i][j])
        visited[i][j] =False
print(result)

'알고리즘 > Python' 카테고리의 다른 글

[백준] 15657 - N과M  (0) 2023.07.23
[백준] 15652 - N과 M  (0) 2023.07.21
[백준] 9019 - DSLR  (0) 2023.07.19
[백준] 10026 - 적록색약  (0) 2023.07.13
[백준] 7569 - 토마토  (0) 2023.07.12