[Python] BOJ/백준 1018번 체스판 다시 칠하기
[문제]
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))
[참고]
[Python 문법] 파이썬 입력 받기(sys.stdin.readline)
파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.
velog.io