# 체스판(2차원 배열) 출력
def pprint(array):
for line in array:
for l in line:
print(l, end=" ")
print()
print()
# 8X8 올바른 검정색, 흰색 체스판 만들기
def makingStart(a, b):
chess = []
for _ in range(4):
chess.append([a, b] * 4)
chess.append([b, a] * 4)
return chess
# 올바른 체스판과 다른 개수 비교(Brute Force)
def checking(ori, new):
count = 0
for i in range(8):
for j in range(8):
if ori[i][j] != new[i][j]:
count += 1
return count
# 검정색, 흰색으로 시작하는 올바른 체스판 형성
black = makingStart("B", "W")
white = makingStart("W", "B")
n, m = map(int, input().split())
chess = []
for _ in range(n):
chess.append(list(input()))
# 8X8 체스판 여러개 만들기
partion = []
partions = []
for i in range(n-7):
for j in range(m-7):
for tmp in chess[i:i+8]:
partion.append(tmp[j:j+8])
partions.append(partion)
partion = []
answer = []
for part in partions:
answer.append(checking(black, part))
answer.append(checking(white, part))
print(min(answer))
black = makingStart("B", "W")
white = makingStart("W", "B")
입력받은 체스판은 [ ["B", "W", ...] , ["W", "B", ... ], ... ] 과 같이 2차원 형태임
8X8 체스판 여러개 만들기 -> partions에 모아둠
part 들이 흰색으로 시작할지, 검정색으로 시작할지 모름
checking 함수를 검정색, 흰색인 경우 모두 확인함
checking 함수는 Brute Force 방식으로 올바른 체스판과 part의 다른 개수를 비교하고, 그 값을 return 함
answer에 checking 한 값을 모두 저장하고, answer의 최소값을 출력함
# 올바른 체스판과 다른 개수 비교(Brute Force)
def checking(chess):
num = 0
for i in range(0, 8, 2):
num += (chess[i][0:8:2].count("W") + chess[i][1:8:2].count("B")
+ chess[i+1][0:8:2].count("B") + chess[i+1][1:8:2].count("W"))
return min(num, 64-num)
n, m = map(int, input().split())
chess = []
for _ in range(n):
chess.append(list(input()))
# 8X8 체스판 여러개 만들기
partion = []
partions = []
for i in range(n-7):
for j in range(m-7):
for tmp in chess[i:i+8]:
partion.append(tmp[j:j+8])
partions.append(partion)
partion = []
answer = []
for part in partions:
answer.append(checking(part))
print(min(answer))
올바른 체스판을 형성하여 푸는 방식은 메모리 낭비가 심함.
makingStart 함수를 없애고, checking 함수를 for 문 형태로 해도 됨