https://www.acmicpc.net/problem/2630
주어진 정사각형 종이를 하얀색(0)과 파란색(1)으로 칠해진 상태에서 동일한 색상의 부분 종이들을 분할하여 최종적으로 만들어진 하얀색 색종이와 파란색 색종이의 개수를 구하는 문제이다.
문제에서 대놓고 N/2로 나누며 더이상 자를 수 없을 때까지 반복한다고 말하며 ‘분할정복’을 쓸 수 있게 힌트를 제공하였다.
<aside> 📌 분할 정복 (divide and conquer)
</aside>
분할 정복의 기본 형태의 Pseudo code
function F(x):
if F(x)의 문제가 간단하다면:
return F(x)를 직접 계산한 값
else:
x를 y1, y2로 분할
F(y1), F(y2) 호출
return F(y1), F(y2)로부터 F(x)를 구한 값
참고: https://dev-shin.tistory.com/entry/분할-정복Divide-and-Conquer, https://moz1e.tistory.com/85
n과 정사각형의 칸의 색을 입력받아 colored_paper 리스트에 저장한다.white_cnt로, 파란색 색종이의 개수는 blue_cnt로 각각 0으로 초기화한다.find_number_of_paper 함수는 색종이의 색을 분할정복하여 재귀적으로 파악하는 함수이다. x_start, y_start부터 시작하는 nxn 크기의 종이가 모두 같은 색인지 파악한다.
white_cnt의 값을 증가시킨다.blue_cnt의 값을 증가시킨다.find_number_of_paper를 호출하여 동일한 작업을 시작한다.