Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 2630 색종이 만들기

정글러 2021. 11. 12. 17:21
n = int(input())
square = []
for i in range(n) :
    square.append(list(map(int, input().split())))

def detect(sq, size) :
    for i in range(size) :
        for j in range(size) :
            if sq[i][j] != sq[0][0] :
                return False
    return True

count = [0, 0]
def DFS(sq, size) :
    if detect(sq, size) :
        count[sq[0][0]] = count[sq[0][0]] + 1
    else :
        DFS([sq[i][:size//2] for i in range(size//2)], size//2)
        DFS([sq[i][size//2:] for i in range(size//2)], size//2)
        DFS([sq[i][:size//2] for i in range(size//2, size)], size//2)
        DFS([sq[i][size//2:] for i in range(size//2, size)], size//2)

DFS(square, n)
print(count[0])
print(count[1])

행렬의 모든 원소가 같다면 Ture, 아니라면 False를 출력하는 함수 detect를 만든다.

detect했을때 False가 나온다면 행렬을 4등분해서 자기 자신을 다시 실행시키는 재귀함수를 만든다.

detect했을때 True가 나온다면 원소가 0이냐 1이냐에 따라 count[0] 혹은 count[1]을 +1하고 재귀를 마친다.

재귀를 반복하여 size가 1*1이 된다면 원소가 한개이니 detect했을때 True가 나올 것이고, 재귀를 마친다.

 

정의한 재귀함수를 실행하고 count를 출력한다.