Post

[백준] 1018. 체스판 다시 칠하기(Python, 파이썬)

백준 온라인의 문제 풀이입니다.

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

시간 제한메모리 제한난이도
2초128 MB실버 4

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.

체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

✔️ 입력

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

✔️ 출력

첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

✔️ 입력 출력 예시

입력출력
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
1
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB
12
9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW
31

🗒️ 내 풀이

이 문제에서 가장 신경 써야 할 부분은 좌측 상단의 색상이 두 가지라는 것이다.

그래서 좌측 상단이 W 일 때와 B 일 때를 같이 확인해줘야 최솟값을 구할 수 있다.

그리고 index를 더해서 짝수, 홀수로 조건문을 거는게 하나의 테크닉인 것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def check(x, y, board):
    count1 = 0 # 좌측 상단이 W
    count2 = 0 # 좌측 상단이 B
    for i in range(x, x + 8):
        for j in range(y, y + 8):
            if (i + j) % 2 == 0:
                if board[i][j] != 'W':
                    count1 += 1
                if board[i][j] != 'B':
                    count2 += 1
            else:
                if board[i][j] != 'B':
                    count1 += 1
                if board[i][j] != 'W':
                    count2 += 1
    return min(count1, count2)
n, m = map(int, input().split())
board = [list(input()) for _ in range(n)]

minimum = 1e9
# 8x8 좌측 상단 한 칸 씩 이동
for i in range(n - 7):
    for j in range(m - 7):
        minimum = min(check(i, j, board), minimum)
print(minimum)

💡 TIL

모든 경우의 수 꼼꼼히 생각하는 연습하기!

This post is licensed under CC BY 4.0 by the author.

[백준] 2667. 단지번호붙이기(Python, 파이썬)

-