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를 출력한다.
'Week 01 ~ 04 : 알고리즘 문제 풀이' 카테고리의 다른 글
파이썬 백준 10830 행렬 제곱 (0) | 2021.11.12 |
---|---|
파이썬 백준 1629 곱셈 (0) | 2021.11.12 |
파이썬 백준 8983 사냥꾼 (0) | 2021.11.12 |
파이썬 백준 2470 두 용액 (0) | 2021.11.11 |
파이썬 백준 2805 나무 자르기 (0) | 2021.11.11 |