https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
문제
M×N 크기의 보드
8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야 함
다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성
입력
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다.
둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다.
B는 검은색이며, W는 흰색이다.
출력
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
내 풀이
N, M = map(int,input().split()) # N*M 크기의 체스판
c = [] # 체스판
total = [] # 칠해야 하는 정사각형의 개수
for i in range(N): # 체스판 입력
c.append(input())
#왼쪽 위가 B로 시작
for n in range(N-7): # 행의 시작지점을 차례로 옮기며 전부 탐색
for m in range(M-7): # 열의 시작지점을 차례로 옮기며 전부 탐색
# 체스판은 8*8크기임으로 -7을 해줌
sum = 0
for i in range(4):
# B로 시작할 경우 홀수 행의(인덱스로는 짝수 0,2,4...) 짝수열은 'B'여야 함
# 'W'일 경우 'B'로 칠함
sum += c[n:n+8:2][i][m:m+8:2].count('W')
# B로 시작할 경우 홀수 행의 홀수열은 'W'여야 함
# 'B'일 경우 'W'로 칠함
sum += c[n:n+8:2][i][m+1:m+9:2].count('B')
# B로 시작할 경우 짝수 행의(인덱스로는 홀수 1,3,5...) 짝수열은 'W'여야 함
# 'B'일 경우 'W'로 칠함
sum += c[n+1:n+9:2][i][m:m+8:2].count('B')
# B로 시작할 경우 짝수 행의 짝수열은 'B'여야 함
# 'W'일 경우 'B'로 칠함
sum += c[n+1:n+9:2][i][m+1:m+9:2].count('W')
total.append(sum) # 칠해야 하는 정사각형의 수를 리스트에 추가
#왼쪽 위가 W로 시작
for n in range(N-7):
for m in range(M-7):
sum = 0
for i in range(4):
# 왼쪽 위가 B로 시작할 경우의 반대
sum += c[n:n+8:2][i][m:m+8:2].count('B')
sum += c[n:n+8:2][i][m+1:m+9:2].count('W')
sum += c[n+1:n+9:2][i][m:m+8:2].count('W')
sum += c[n+1:n+9:2][i][m+1:m+9:2].count('B')
total.append(sum)
print(min(total)) # total 리스트의 가장 작은 값을 출력