백준 1018번 - 체스판 다시 칠하기 (Python3)
코드
# 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인 경우를 모두 비교해서 각 각의 변수에 다시 칠하는 횟수를 저장하며 그 중 최솟값을 비교하는 방법을 떠올리는 게 힘들었다.
댓글남기기