BAEKJOON #1018 체스판 다시 칠하기

2021. 4. 26. 10:21개발노트

이 문제의 저작권은 BAEKJOON에 있습니다.

https://www.acmicpc.net/problem/1018

 

풀이

주어지는 판에서 8 * 8 만큼씩 자른 후 W가 시작점 일 때와 B가 시작점 일 때

바꿔야 하는 칸의 개수를 구하고 그중 최솟값을 구한다. 

 

x, y 축의 값을 더한 값이 홀수일 때와 짝수일 때 항상 같은 색으로 칠해지므로 다른 색으로 칠해진 부분의 값을 카운트한다.

 

# 체스판 다시 칠하기
# https://www.acmicpc.net/problem/1018

N ,M = list(map(int, input().split(" ")))
bord = []
for _ in range(N):
    bord.append(input())

change_num_list = []

# N - 7 만큼 for문으로 반복
# 체스판 크기가 8 * 8 이기 떄문.
for i in range(N - 7):
    # M - 7만큼 for문으로 반복
    for j in range(M - 7):
        w_cnt = 0
        b_cnt = 0
        for n in range(i, i + 8):
            for m in range(j, j + 8):                
                # 시작점이 W일 때 n + m 이 짝수,
                # bord[n][m]이 B면 바꿔야 하는 칸이므로 카운트
                if  (n + m) % 2 == 0 and bord[n][m] == "B":
                    w_cnt += 1
                # 시작점이 W일 때 n + m 이 홀수,
                # bord[n][m]이 W면 바꿔야 하는 칸이므로 카운트
                elif (n + m) % 2 == 1 and bord[n][m] == "W":
                    w_cnt += 1
                # 위와 반대로 시작점을 B로 카운트
                if  (n + m) % 2 == 0 and bord[n][m] == "W":
                    b_cnt += 1
                elif (n + m) % 2 == 1 and bord[n][m] == "B":
                    b_cnt += 1
        # 카운트가 더 작은 값을 리스트에 삽입 
        change_num_list.append(min(w_cnt, b_cnt))
print(min(change_num_list))