n, m = map(int, input().split())
board = [list(input()) for _ in range(n)]
coloring = []
for a in range(n - 7): # 8*8의 범위 지정
for b in range(m - 7):
w_idx = 0 # 흰색으로 시작할 경우 색칠되어야 하는 개수
b_idx = 0 # 검은색으로 시작할 경우 색칠되어야 하는 개수
for i in range(a, a + 8): # 시작 지점
for j in range(b, b + 8): # 시작지점
if (i + j) % 2 == 0: # 인덱스의 합이 짝수일때. 짝수는 시작값과 같아야하니까.
if board[i][j] != 'W': # B라면
w_idx += 1 # W로 칠하기(흰색으로 시작할 경우 색칠되어야함)
else:
b_idx += 1 # B로 칠하기 (검정색으로 시작할 경우 색칠되어야함)
else: # 인덱스 합이 홀수인 경우
if board[i][j] != 'W': # B이면
b_idx += 1 # B로 칠하기(검은색으로 시작할경우 색칠되어야함)
else:
w_idx += 1 # W로 칠하기(흰색으로 시작할경우 색칠되어야함)
coloring.append(w_idx) # W로 시작할때의 경우의 수
coloring.append(b_idx) # B로 시작할때의 경우의 수
print(min(coloring))
구글링을 하면서도 엄청 헷갈렸던 문제... 디버깅을 하면서 천천히 해보면서 이해했다.
8*8의 범위 중에서 첫 칸이 흰색으로 시작할 경우 색칠되어야 하는 경우의 수와 검은색일 경우의 수를 구해 최종적으로는 최소값을 구해주면 되는 문제였다.
필요한 변수를 만들어주고, 범위를 지정해주기 위해 i, j 반복문을 사용한다. 그리고 인덱스의 합이 짝수라면 시작칸의 색과 같아야 하기때문에 저런 조건을 적어주었다.
(0, 0) W | (0, 1) B | (0, 2) W | (0, 3) B | (0, 4) W | (0, 5) B | (0, 6) W | (0, 7) B |
(1, 0) B | (1, 1) W | (1, 2) B | (1, 3) W | (1, 4) B | (1, 5) W | (1, 6) B | (1, 7) W |
이렇게 인덱스를 정리해보면 첫칸이 W(흰색)일 경우, 인덱스의 숫자를 모두 더했을때 짝수인 경우는 모두 첫칸과 같이 W라는것을 볼 수 있다.
그래서 짝수일 경우, 현재 칸이 W가 아니라면(즉 B라면) 첫칸이 흰색일 경우에는 색칠 되어야 하는 칸이니 값을 더해준다. 홀수의 경우에도 마찬가지다. 현재 칸이 W가 아니라면(B라면) 첫칸과 다른색이 되어야 하기때문에 첫칸이 검은색으로 시작하는 경우 W가 되어야한다. 그래서 값을 추가해주는 것이다.
반복문이 끝나면 배열에 값을 추가해주고 최종적으로 min을 사용해 최소값을 구해준다.
지금 정리하면서도 헷갈린다... 나중에 다시 풀어봐야겠다.
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
'study > Algorithm' 카테고리의 다른 글
[백준] 파이썬 16926번: 배열 돌리기 1 (0) | 2024.04.01 |
---|---|
[백준] 파이썬 1652번: 누울 자리를 찾아라 (0) | 2024.04.01 |
[백준] 파이썬 2556번: 최댓값 (0) | 2024.04.01 |
[백준] 파이썬 2738 : 행렬 덧셈 (0) | 2024.04.01 |
[백준] 파이썬 5525번: IOIOI (0) | 2024.03.30 |