문제풀이/BOJ

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

서채리 2021. 7. 26. 20:54

[문제]

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 


[풀이]

 

1. 보드가 8*8보다 큰 경우 어느 행, 열을 시작점으로 두고 체스판을 만드는지에 따라 다시 칠해야 하는 정사각형의 개수가 달라진다. 따라서 반복문을 통해 a를 행의 시작점으로 잡았을 때와 b를 열의 시작점으로 잡았을 때의 모든 경우를 다 돌아본다.

for a in range(n-7):
        for b in range(m-7):

 

 

2. 행과 열의 시작점을 기준으로 8칸씩 체크한다.

현재 행의 번호 i와 현재 열의 번호 j의 합이 짝수일 경우 시작점과 색이 같아야 하고,

홀수일 경우 시작점과 색이 달라야 한다.

 

체스판의 시작이 'W'일 경우 바꿔야 할 체스 판의 개수를 index1에 저장하고

체스판의 시작이 'B'일 경우 바꿔야 할 체스 판의 개수를 index2에 저장한다.

for i in range(a, a+8):
	for j in range(b, b+8):
		index1 = 0  # W로 시작할 경우 바뀐 체스 판 개수
        	index2 = 0  # B로 시작할 경우 바뀐 체스 판 개수

 

8*8로 자른 체스판이 'W'로 시작할 경우

(i+j) % 2 == 0 일 경우 'W'이어야 한다. 만약 'W'가 아니라면 index1을 1 증가시킨다.

(i+j) % 2 !0 일 경우 'B'이어야 한다. 만약 'B'가 아니라면 index1을 1 증가시킨다.

 

마찬가지로 8*8로 자른 체스판이 'B'로 시작할 경우 바꿔야 할 체스판의 개수는 index2에 저장한다.

                    if (i+j) % 2 == 0:
                        if board[i][j] != 'W':
                            index1 += 1
                        if board[i][j] != 'B':
                            index2 += 1
                    else:
                        if board[i][j] != 'B':
                            index1 += 1
                        if board[i][j] != 'W':
                            index2 += 1

 


[코드]

import sys

if __name__ == '__main__':
    n, m = map(int, sys.stdin.readline().split())
    board = [sys.stdin.readline().strip() for _ in range(n)]
    count = []

    for a in range(n-7):
        for b in range(m-7):
            index1 = 0  # W로 시작할 경우 : 바꿔야 할 체스 판 개수
            index2 = 0  # B로 시작할 경우 : 바꿔야 할 체스 판 개수
            for i in range(a, a+8):
                for j in range(b, b+8):
                    if (i+j) % 2 == 0:
                        if board[i][j] != 'W':
                            index1 += 1
                        if board[i][j] != 'B':
                            index2 += 1
                    else:
                        if board[i][j] != 'B':
                            index1 += 1
                        if board[i][j] != 'W':
                            index2 += 1
            count.append(min(index1, index2))
    print(min(count))

 

 

[참고]

https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io