[문제]
https://www.acmicpc.net/problem/1018
[풀이]
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))
[참고]
'문제풀이 > BOJ' 카테고리의 다른 글
[Python] BOJ/백준 11650번 좌표 정렬하기 (0) | 2021.07.28 |
---|---|
[Python] BOJ/백준 2798번 블랙잭 (0) | 2021.07.28 |
[Python] BOJ/백준 10828번 스택 (0) | 2021.07.26 |
[Python] BOJ/백준 10866번 덱 (0) | 2021.07.26 |
[Python] BOJ/백준 10845번 큐 (0) | 2021.07.26 |