하지만 그리디하게 풀기에는 N, M의 크기가 매우 크며(초기 상태를 정하는 데만 해도 3^2000까지 소요될 수 있다) 이후의 경우의 수도 하나가 아닌 여러 케이스가 존재할 수 있다.
여기서 발상을 전환해 보자. 2번과 3번은 '그 지점의 흑백을 전환하는 여부'가 차이가 있다. 즉 2번을 3번으로, 혹은 3번을 2번으로 전환함으로써 그 지점의 흑백만을 전환할 수 있다. 따라서 모든 칸을 2번 규칙에 따라 뒤집어 준 후, 이후 'B'에 해당하는 칸만 3번으로 전환한다면 O(NM)의 시간 내에 풀이 가능하다!
조건에 대한 관찰력을 요하는 문제였다... 무섭다.
풀이 코드
import sys
input = sys.stdin.readline
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
N, M = map(int, input().split())
map_list = [list(input().strip()) for _ in range(N)]
answer = [['2']*M for _ in range(N)]
def reverse(x, y) :
for k in range(4) :
ax, ay = x + dx[k], y + dy[k]
if -1 < ax < M and -1 < ay < N :
map_list[ay][ax] = 'B' if map_list[ay][ax] == 'W' else 'W'
for i in range(N) :
for j in range(M) :
reverse(j, i)
for i in range(N) :
for j in range(M) :
if map_list[i][j] == 'B' :
answer[i][j] = '3'
print(1)
for _answer in answer :
print(''.join(_answer))