코드

# 8x8 크기로 잘라서 체스판 만들기
n, m = map(int, input().split())
board = []
cnt = []
for _ in range(n):
    board.append(list(input()))
    
# 전체 체스판을 8x8로 나누어서 계속 반복해야함
# 앞 2개의 for문 : 자르는 범위의 시작점 즉, 맨 왼쪽 좌표 설정
# 뒤 2개의 for문 : 시작점을 기준으로 8칸 씩 반복해서 'W', 'B' 체크
for x in range(n-7):
    for y in range(m-7):
        w_idx = 0         # 시작점이 W인 경우 카운트
        b_idx = 0         # 시작점이 B인 경우 카운트
        
        for i in range(x, x+8):
            for j in range(y, y+8):
                # 시작점의 색 == 행 + 열이 짝수
                if (i+j) % 2 == 0:
                    if board[i][j] != 'W':
                        w_idx += 1
                    if board[i][j] != 'B':
                        b_idx += 1
                else:
                    if board[i][j] != 'B':
                        w_idx += 1
                    if board[i][j] != 'W':
                        b_idx += 1
            # w_idx, b_idx의 변동 확인
            # print(w_idx, b_idx)
        
        # 다시 칠해야 하는 정사각형 개수의 최솟값을 출력
        cnt.append(min(w_idx, b_idx))
        
print(min(cnt))

문제 해설

위 문제는 브루트 포스 문제로 모든 경우의 수를 하나 씩 다 따져가며 해결해야 하는 문제다. 이런 형식의 문제는 결국 어떤 패턴으로 모든 문제를 해결할 수 있나 파악하는 것이 가장 중요하다.

참고 블로그

문제 풀이 경험이 부족하다는 것을 여지 없이 느끼게 해주었으며 시작점이 W일 때와 B인 경우를 모두 비교해서 각 각의 변수에 다시 칠하는 횟수를 저장하며 그 중 최솟값을 비교하는 방법을 떠올리는 게 힘들었다.

댓글남기기