Post

백준 2630번 python 풀이 - 색종이 만들기

문제 링크

2630번

해결책

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
49
import sys

N = int(sys.stdin.readline().rstrip())

paperColor = []
for i in range(N):
    paperColor.append(list(map(int, sys.stdin.readline().rstrip().split())))

# 파란색 수(칸의 총합)에 따른 파란색 종이와 하얀색 종이
sheet = [[[0, 1]], [[0, 1], [1, 3], [2, 2], [3, 1], [1, 0]]]

blue = 0
white = 0


def dfs(n):
    global blue
    global white
    stack = [(0, n, 0, n)]

    while stack:
        minX, maxX, minY, maxY = stack.pop()

        _sum = 0
        for i in range(minX, maxX):
            for j in range(minY, maxY):
                _sum += paperColor[i][j]

        if (maxX - minX) == 2:
            blue += sheet[1][_sum][0]
            white += sheet[1][_sum][1]

        # 모두 파랄 경우
        elif _sum == (maxX-minX) ** 2:
            blue += 1
        # 모두 하얄 경우
        elif _sum == 0:
            white += 1

        else:
            stack.append((minX, (minX + maxX) // 2, minY, (minY+maxY) // 2))
            stack.append(((minX + maxX) // 2, maxX, minY, (minY+maxY) // 2))
            stack.append((minX, (minX + maxX) // 2, (minY+maxY) // 2, maxY))
            stack.append(((minX + maxX) // 2, maxX, (minY+maxY) // 2, maxY))


dfs(N)
print(white)
print(blue)

주석으로 달 설명

분할 정복… Divide and Conquer. 커맨드 앤 컨커 같은 이 방식은 분할을 통해 문제를 계속 쉽게 만들어 해결하는 것이다.

이번 문제에서 이를 해결하기 위해, NXN의 value들의 총합을 구하고, 이를 N^2와 비교하여 0 이면 전부 하양, N^2이면 전부 파랑, 아니면 4칸으로 분할하여 이들을 스택에 넣고, 다 확인하여 전부 분할할 때까지 진행하였다.

This post is licensed under CC BY 4.0 by the author.