아니 이걸 어떻게 생각하지?
문법을 보며 실버5 문제부터 훑고 있는 내게 생각보다 난관이었던 문제였다.
문제정의를 어떻게 해야했고
여기서 생각이 어떻게 뻗어나가야할 지 몰랐다.
첫째 줄에 N과 M이 주어진다.
N과 M은 8보다 크거나 같고,
50보다 작거나 같은 자연수이다.
둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다.
B는 검은색이며, W는 흰색이다.
예제로 보여지는 입력과 출력은 어떤 알고리즘일까 고민했다
a,b = map(int, input().split(" "))
chess_table = []
cnt = []
for i in range(a):
chess_table.append(input())
for i in range(a-7): #첫 번째 for문
for j in range(b-7):
w_start = 0
b_start = 0
for k in range(i, i+8):
for l in range(j, j+8):
if (k+l) % 2 ==0:
if chess_table[k][l] != 'W':
w_start = w_start+ 1
if chess_table[k][l] != 'B':
b_start = b_start+ 1
else :
if chess_table[k][l] != 'B':
w_start =w_start + 1
if chess_table[k][l] != 'W':
b_start = b_start +1
cnt.append(w_start)
cnt.append(b_start)
print(min(cnt))
for i in range(a-7):
for j in range(b-7):
w_start = 0
b_start = 0
for k in range(i, i+8):
for l in range(j, j+8):
if (k+l) % 2 ==0:
if chess_table[k][l] != 'W':
w_start = w_start+ 1
if chess_table[k][l] != 'B':
b_start = b_start+ 1
else :
if chess_table[k][l] != 'B':
w_start =w_start + 1
if chess_table[k][l] != 'W':
b_start = b_start +1
cnt.append(w_start)
cnt.append(b_start)
if (k+l) % 2 ==0:
나는 위 부분에서 이해가 가지 않았는데 위 연산을 해서 구분하는 이유는 체스판의 경우 WBWBWBWB와 같은 식으로 번갈아 가면서 같은 게 나오기 때문이었다.
만약 정상적인 체스판이라면 짝수일 때는 같은 색깔의 타일이 있어야 하는 것이다.
홀수인 경우에도 위와 동일하기 때문인데, chess_table[0][0]과 chess_table[1][0]은 달라야 하기 때문에
if chess_table[k][l] != 'B':
w_start =w_start + 1
위와 같이 if 문을 작성해야하는 것이다.
그리고 나서 W로 시작했을 때와 B로 시작했을 때의 타일을 몇개 바꿨는지를 cnt 리스트에 append 하고
print(min(cnt))로 결과값을 출력한다.