백준_1018_체스판 다시 칠하기(브루트포스)

맹민재·2023년 3월 29일
0

알고리즘

목록 보기
11/134
import math
def chess(i, j):
    f_w = 0
    f_b = 0
    for n in range(i, i+8):
        for m in range(j, j+8):
            if (n+m)%2==0:
                if board[n][m] == 'W':
                    f_b += 1
                else:
                    f_w += 1
            else:
                if board[n][m] == 'W':
                    f_w += 1
                else:
                    f_b += 1

    return min(f_w, f_b)


n, m = [int(v) for v in input().split()]
board = []
for _ in range(n):
    board.append(input())

cnt = math.inf

for i in range(n-7):
    for j in range(m-7):
        cnt = min(cnt, chess(i,j))
print(cnt)

체스판의 크기는 8*8 크기로 정해져 있으므로 처음에 2중 for문을 돌면서 각 체스판에 대해 바꿔야 하는 색깔의 숫자를 구하며 그 중 제일 작은 값이 문제의 정답이다

각 체스판에 대해 바꿔야 하는 색깔의 숫자는 처음에 W로 시작하는 경우와 B로 시작하는 경우를 따로 구하고 둘 중에 더 작은 값을 return한다.

체스판은 W B W B 이런 식으로 반복하는 패턴이다. list의 세로 줄? 이 바뀐다고 하더라도 두 인덱스의 합이 짝수인 것은 첫 번째 색깔과 같고 홀수인 것은 다르다는 규칙이있다.

이를 토대로 "if (n+m)%2==0" 이 조건으로 W로 시작하는 경우와 B로 시작하는 경우에 대해 바꿔야 하는 색깔의 숫자를 구할 수 있다.


예전에 풀 때는 결국 해결하지 못해 인터넷에서 참고해서 풀었지만 이번에 다시 풀 때는 스스로 해결했다. ^^

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글