이 문제는 일단 혼자서 생각해볼 시간도 부족하긴 했지만, 브루트포스 알고리즘으로 모든 경우를 다 거치기 위해 어떻게 해줘야 할지 정말 막막했다.
다른 분들 코드를 참고해보니, 8 x 8 체스판으로 만들어주며 주어진 체스판을 훑어주어야 해서
이를 위해 행과 열을 고정시켜주어야 했다.
for i in range(n-7):
for j in range(m-7): #8*8크기의 체스판을 위해 행,열 고정
cntW = 0
cntB = 0
for x in range(i, i+8):
for y in range(j, j+8):
이런 식으로, 8 x 8을 위해서 주어진 값에서 7을 빼고 for문을 돌려주면서, 그 값으로부터 총 8 x 8의 경우를 모두 확인할 수 있도록 해준다. 따라서 주어진 체스판을 쓰윽 훑어내려오며 다시 칠해야 하는 개수를 구해준다.
if (x+y)%2 == 0:
if arr[x][y] != "W":
cntW += 1
if arr[x][y] != "B":
cntB += 1
else:
if arr[x][y] != "B":
cntW += 1
if arr[x][y] != "W":
cntB += 1
그 다음으로, 맨 하단에 첨부한 도움이 정말 많이 된 다른 분의 사이트를 보게 되면 더 쉽게 설명이 되어있는데,
칸이 짝수번째인지, 홀수번째인지를 나누어 매칭이 되지 않는 부분을 세어준다.
#체스판 다시 칠하기
n, m = map(int, input().split())
arr = [list(input()) for _ in range(n)]
chess = []
for i in range(n-7):
for j in range(m-7): #8*8크기의 체스판을 위해 행,열 고정
cntW = 0
cntB = 0
for x in range(i, i+8):
for y in range(j, j+8):
if (x+y)%2 == 0:
if arr[x][y] != "W":
cntW += 1
if arr[x][y] != "B":
cntB += 1
else:
if arr[x][y] != "B":
cntW += 1
if arr[x][y] != "W":
cntB += 1
chess.append(cntW)
chess.append(cntB)
print(min(chess))
따라서, 가장 작은 값을 구해주면 된다.
이 문제는 일단 체스판을 칠해주는 방법이 두 가지인 것도 그렇고, 매칭이 되지 않는 부분을 세어주는 모든 조건부분을 생각하는 것과 떠올리는 것, 이해하는 것 등등 많은 부분이 부족했다. 그래서 다른 분들의 코드를 많이 참고하게 되었고, 다음 번에 풀어볼 때 스스로 조건과 세어주는 방법을 어떻게 구현해야 할지를 많이 고민해봐야겠다....
참고한 사이트)
god-gil.tistory.com/62
반응형