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

코뉴·2021년 8월 15일
0

백준🍳

목록 보기
54/149
post-custom-banner

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

🥚문제


🥚입력/출력


🍳코드

from sys import stdin
input = stdin.readline

# 입력
n, m = map(int, input().split())
board = []
for _ in range(n):
    data = list(input().strip())
    board.append(data)

# 정사각형 개수의 최솟값을 저장하는 min_paint
min_paint = None

# 순회하면서 8*8 판으로 나눠본다
for row in range(n):
    for col in range(m):
        # 8*8 판으로 나눌 수 있는 경우
        if row + 8 <= n and col + 8 <= m:
            # 가장 좌측 상단이 W여야 할 때, 칠해야하는 칸의 개수
            W_paint = 0
            # 가장 좌측 상단이 B여야 하 때, 칠해야하는 칸의 개수
            B_paint = 0

            # 가장 좌측 상단이 W로 칠해져야 하는 경우 -> B이면 다시 색칠
            # 가장 좌측 상단이 B로 칠해져야 하는 경우 -> W이면 다시 색칠
            for r in range(0, 8, 2):
                for c in range(0, 8, 2):
                    if board[row+r][col+c] == "W":
                        B_paint += 1
                    else:
                        W_paint += 1

            # 가장 좌측 상단이 W로 칠해져야 하는 경우 -> B이면 다시 색칠
            # 가장 좌측 상단이 B로 칠해져야 하는 경우 -> W이면 다시 색칠
            for r in range(1, 8, 2):
                for c in range(1, 8, 2):
                    if board[row + r][col + c] == "W":
                        B_paint += 1
                    else:
                        W_paint += 1

            # 가장 좌측 상단이 W로 칠해져야 하는 경우 -> W이면 다시 색칠
            # 가장 좌측 상단이 B로 칠해져야 하는 경우 -> B이면 다시 색칠
            for r in range(0, 8, 2):
                for c in range(1, 8, 2):
                    if board[row + r][col + c] == "W":
                        W_paint += 1
                    else:
                        B_paint += 1

            # 가장 좌측 상단이 W로 칠해져야 하는 경우 -> W이면 다시 색칠
            # 가장 좌측 상단이 B로 칠해져야 하는 경우 -> B이면 다시 색칠
            for r in range(1, 8, 2):
                for c in range(0, 8, 2):
                    if board[row + r][col + c] == "W":
                        W_paint += 1
                    else:
                        B_paint += 1

            # 만약 W_paint나 B_paint의 값이 0이면 아무데도 칠하지 않아도 됨
            # 우리의 목적은 최소 개수를 구하므로 여기서 중단
            if W_paint == 0 or B_paint == 0:
                min_paint = 0
                break

            # W_paint와 B_paint를 비교해서 작은 값을 min_paint와 비교한다
            temp_min_paint = None
            if W_paint < B_paint:
                temp_min_paint = W_paint
            else:
                temp_min_paint = B_paint

            if min_paint is None:
                min_paint = temp_min_paint
            else:
                # temp_min_paint가 min_paint보다 작으면 paint의 값을 저장
                if min_paint > temp_min_paint:
                    min_paint = temp_min_paint
# 출력
print(min_paint)

🧂아이디어

  • 브루트포스
profile
코뉴의 도딩기록
post-custom-banner

0개의 댓글