본문 바로가기

파이썬

[백준] 1018번 체스판 다시 칠하기

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

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

<풀이>

N, M = map(int, input().split())
arr = [list(input()) for _ in range(N)]
result = 64
for i in range(N-7):
    for j in range(M-7):
        black = 0
        white = 0
        for k in range(i, i+8):
            for l in range(j, j+8):
                if (k+l) % 2 == 0:
                    if arr[k][l] != 'W':
                        white += 1
                    else:
                        black += 1
                else:
                    if arr[k][l] != 'B':
                        white += 1
                    else:
                        black += 1
        result = min(min(black, white), result)
print(result)

 

<풀이>

1. for문 4번 돌려서 8*8 정사각형 탐색한다.

2. 각 행렬의 행과 열의 값을 더 했을 때 짝수면 짝수끼리 홀수면 홀수끼리 색깔이 같아야 하므로 (k + l)%2로 나눠준다.

3. 시작이 black이라고 생각했을 때와 white라고 생각했을 때 경우 각각 바꿔야 하는 개수를 구해서 min으로 구한다.