코딩테스트 대비/BOJ

[Baekjoon/Python] 1018번: 체스판 다시 칠하기 - 효과는 굉장했다!

bluetag_boy 2021. 10. 10. 21:18
반응형
 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

알고리즘 분류

  • 브루트포스 알고리즘

 

SOLUTION

import sys

N, M = map(int, sys.stdin.readline().split())
chess = [sys.stdin.readline().rstrip() for _ in range(N)] # 체스판 형성
min_cnt = []  

for i in range(N-7): # 브루트포스 적용, 체스판 8x8 크기가 나올 수 있는 모든 경우의 수 탐색
    for j in range(M-7):
        cnt1 = 0
        cnt2 = 0
        for k in range(i, i+8): # 첫 칸을 검정색 기준으로 두고 검사하는 경우
            for l in range(j, j+8): 
                if k % 2 == 0 and l % 2 == 0:
                    if chess[k][l] == "W":
                        cnt1 += 1

                elif k % 2 == 1 and l % 2 == 1:
                    if chess[k][l] == "W":
                        cnt1 += 1 

                elif k % 2 == 0 and l % 2 == 1:
                    if chess[k][l] == "B":
                        cnt1 += 1

                elif k % 2 == 1 and l % 2 == 0:
                    if chess[k][l] == "B":
                        cnt1 += 1

        for k in range(i, i+8): # 첫 칸을 흰색 기준으로 두고 검사하는 경우
            for l in range(j, j+8):
                if k % 2 == 0 and l % 2 == 0: 
                    if chess[k][l] == "B":
                        cnt2 += 1

                elif k % 2 == 1 and l % 2 == 1:
                    if chess[k][l] == "B":
                        cnt2 += 1 

                elif k % 2 == 0 and l % 2 == 1:
                    if chess[k][l] == "W":
                        cnt2 += 1

                elif k % 2 == 1 and l % 2 == 0:
                    if chess[k][l] == "W":
                        cnt2 += 1

        min_cnt.append(min(cnt1, cnt2)) # 두 케이스를 비교해 적은 값을 append

print(min(min_cnt)) # 가장 작은 값 출력