상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 14500번: 테트로미노 (삼성 A형 기출 문제)

Python/문제풀이 (삼성 A형 대비)

by 코딩하는 낙타 2020. 2. 14. 09:59

본문

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누

www.acmicpc.net

 

내 풀이:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def make_block(idx, y, x, visited):
    global ans
    new = visited[:]
    new.append([y, x])
    if idx == 3:
        result = 0
        for co in new:
            result += arr[co[0]][co[1]]
 
        if ans < result:
            ans = result
        return
 
    lst = []
    for dir in range(3):
        ny = y + dy[dir]
        nx = x + dx[dir]
 
        if 0 <= ny <= N - 1 and 0 <= nx <= M - 1 and [ny, nx] not in new:
            make_block(idx+1, ny, nx, new)
            lst.append(arr[ny][nx])
 
    if idx == 0:
        if 0 <= y-1:
            lst.append(arr[y-1][x])
 
        if len(lst) == 4:
            result = sum(lst) - min(lst) + arr[y][x]
            if ans < result:
                ans = result
 
        elif len(lst) == 3:
            result = sum(lst) + arr[y][x]
            if ans < result:
                ans = result
 
 
N, M = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(N)]
 
dy = [010]
dx = [10-1]
ans = 0
for i in range(N):
    for j in range(M):
        make_block(0, i, j, [])
 
print(ans)
 

Python3, 7628ms

재귀함수를 이용하여 좌우와 아래쪽 3방향만 탐색하여 중복으로 만들어지는 도형을 최대한 줄이고자 하였다. 아마도 사각형 모양의 블록을 제외하고는 중복하는 블록은 나타나지 않을 것이다. 문제가 ㅗ모양 테트로미노인데 재귀로 한번에 탐색하는 것이 불가능하기 때문에 첫 조각을 선택 후 주변을 살펴서 3개, 4개의 공간이 있으면 그에 따른 최대값을 계산하는 방식으로 알고리즘을 구현하였다.

관련글 더보기

댓글 영역