https://www.acmicpc.net/problem/2630
면의 모든 칸이 같은 색이 될 때까지 색종이를 1/4
로 계속 분할하는 문제다.
파란색과 하얀색 종이의 갯수를 출력하면 된다.
0. 입력 받기
n = int(input())
papers = []
for _ in range(n):
row = list(map(int,input().rsplit()))
papers.append(row)
1. 현재 칸과 다른 색일 경우 1/4로 분할한다.
# 현재 칸 색상
curr = papers[row][col]
for i in range(row, row + n):
for j in range(col, col + n):
if curr != papers[i][j]:
# 길이를 절반으로 나눈다.
next_n = n // 2
check(row, col, next_n) # 1
check(row, col + next_n, next_n) # 2
check(row + next_n, col, next_n) # 3
check(row + next_n, col + next_n, next_n) # 4
return
2. 현재 칸의 색상에 따라 갯수 더해주기
# 현재 칸 색상이 흰 색이면
if curr == 0:
white_cnt += 1
# 현재 칸 색상이 파란색이면
else:
blue_cnt += 1
return
import sys
input = sys.stdin.readline
n = int(input())
papers = []
for _ in range(n):
row = list(map(int,input().rsplit()))
papers.append(row)
blue_cnt, white_cnt = 0, 0
def check(row,col,n):
global blue_cnt, white_cnt
curr = papers[row][col]
for i in range(row, row + n):
for j in range(col, col + n):
if curr != papers[i][j]:
next_n = n // 2
check(row, col, next_n)
check(row, col + next_n, next_n)
check(row + next_n, col, next_n)
check(row + next_n, col + next_n, next_n)
return
if curr == 0:
white_cnt += 1
else:
blue_cnt += 1
return
check(0,0,n)
print(white_cnt)
print(blue_cnt)