Spadework 2020. 1. 27. 22:27

문제

N * M 보드가 존재하며, 각 칸은 검은색 or 흰색으로 칠해져 있다. 이 보드를 잘라서 8*8 크기의 체스판으로 만들려고 한다. 체스판으로 만들기 위해 칸의 색을 다시 칠할 수 있다


N, M : 8 ~ 50

 

입력 : n, m, 체스판([n][m])
출력 : N(8*8로 자른 후 칠을 가장 적게 할 수 있는 횟수)

풀이

8*8칸을 짜를 수 있는 모든 이중 반복을 : i(0, N-8), j(0, M-8)

- 반복을 수행하며 최솟값은 l[N-7][M-7]으로 생성한 리스트에 기록

 

 

8*8판을 기준으로 칠을 가장 적게 할 수 있는 횟수 : 처음 시작되는 패턴을 기반으로 8*8 칸으로 분석. 이후 최솟값은 p or 64-p 중 작은 값 반환

def p(b, n, m):
	s, c = b[n][m], 0
	for i in range(n, n+8):
		for j in range(m, m+8):
			if(s != b[i][j]): c += 1
			s = 'W' if s == 'B' else 'B'
		s = 'W' if s == 'B' else 'B'
	return min(c, 64-c)

n, m = map(int, input().split())
b = [list(input()) for _ in range(n)]
l = [[64]*(m-7) for _ in range(n-7)]

for i in range(n-7):
	for j in range(m-7):
		l[i][j] = p(b, i, j)

print(min(map(min, l)))