

봉건 시대 땐 왕이 영토를 쪼개 제후들에게 맡겼죠.
그럼 우리도 알고리즘 문제를 쪼개 재귀 함수들에게 맡기면 어떨까요?
그게 바로 분할 정복이랍니다!
보통은 재귀함수를 이용해 구현


문제에서 분할 정복으로 풀어야 한다는 사실을 사실상 스포하고 있다.
가로와 세로로 중간 부분을 잘라서, 네 개의 종이로 나눈다종이가 모두 하얀색 / 파란색으로 칠해져 있거나, 하나의 정사각형 칸이 되어 자를 수 없을 때까지재귀 함수는 목표에 맞게, 현재 종이 내 총 하얀색 색종이 및 파란색 색종이의 개수를 반환하게끔 만든다.
N, 첫 칸의 좌표 x행 y열(하얀색 색종이 수, 파란색 색종이 수)(1, 0), 파란색이면 (0, 1)을 반환이런 재귀 함수를 만들면 아래 그림처럼 동작한다.


N = int(input())
grid = []
for _ in range(N):
grid.append(list(map(int, input().split())))
# 현재 종이 내 총 하얀색 / 파란색 색종이의 개수 세기
# N: 한 변의 길이
# 첫 칸 -> x행 y열
def check(N, x, y):
# 모두 하얀칸 / 파란칸? 아님 섞여 있음?
def find_color(N, x, y):
# 첫 칸의 색
color = grid[x][y]
# 첫 칸과 불일치하는 색이 있는지 확인
for i in range(x, x + N):
for j in range(y, y + N):
if grid[i][j] != color:
return -1 # 섞여 있음
return color # 하얀칸은 0, 파란칸은 1
color = find_color(N, x, y)
if color == 0: # 모두 하얀칸
return 1, 0
elif color == 1: # 모두 파란칸
return 0, 1
else: # 하얀칸, 파란칸 섞임
white, blue = 0, 0
half = N // 2
x_list = [x, x, x + half, x + half]
y_list = [y, y + half, y, y + half]
# 종이를 4등분
# 4등분한 종이 내 하얀색 / 파란색 색종이 수 세기
for i in range(4):
cut = check(half, x_list[i], y_list[i])
white += cut[0]
blue += cut[1]
return white, blue
result = check(N, 0, 0)
print(result[0])
print(result[1])
find_color: 모든 칸이 하얀색 / 파란색인지, 색이 섞여 있는지 확인변의 길이 // 2를 half로 둠x, yx, y + halfx + half, yx + half, y + halfcut은 (하얀종이 수, 파란종이 수)로 구성됨white 변수에 cut[0]을blue 변수에 cut[1]을 더하고check_color 함수가 여러 번 실행되며, 최악의 경우 전체 칸을 모두 검사하므로
선생님 재귀는 너무 어려워요...