알고리즘/알고리즘 문제 풀이
(Python) 백준 1018번 - 체스판 다시 칠하기
용꿀
2023. 1. 2. 14:19
문제 링크 : https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
풀이
브루트포스 문제이기 때문에 하나하나씩 계산하는 과정이 귀찮을 뿐 풀이가 어렵진 않았다.
import sys
def cnt_sqr(r, c, board, bw): # 8*8로 체스판을 자른 후에 다시 칠해야하는 칸의 수 계산
cnt = 0
if bw == 'B': # 8*8 체스판의 시작칸이 'B'인 경우
for i in range(8):
for j in range(8):
# 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
if (r+i) % 2 == 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'W':
cnt += 1
# 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
elif (r+i) % 2 == 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'B':
cnt += 1
# 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
elif (r+i) % 2 != 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'B':
cnt += 1
# 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
elif (r+i) % 2 != 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'W':
cnt += 1
else: # 8*8 체스판의 시작칸이 'W'인 경우
for i in range(8):
for j in range(8):
# 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
if (r+i) % 2 == 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'B':
cnt += 1
# 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
elif (r+i) % 2 == 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'W':
cnt += 1
# 'B'여야 하는 칸이지만 'W'가 칠해져 있는 경우 카운트 증가
elif (r+i) % 2 != 0 and (j+1) % 2 == 0 and board[r+i][c+j] == 'W':
cnt += 1
# 'W'여야 하는 칸이지만 'B'가 칠해져 있는 경우 카운트 증가
elif (r+i) % 2 != 0 and (j+1) % 2 != 0 and board[r+i][c+j] == 'B':
cnt += 1
return cnt
n, m = map(int, sys.stdin.readline().split())
board = [] # 전체 체스판
for _ in range(n):
row = list(sys.stdin.readline().strip())
board.append(row)
min_b = 65 # 자른 체스판의 크기가 8*8이므로 65보다 카운트가 크게 나올 수는 없으므로 초기 최소값을 65로 설정
min_w = 65
for r in range(n-7): # 8*8로 자를 것이기 때문에 0 ~ n-8의 범위 내에서만 시작 칸을 잡을 수 있음
for c in range(m-7):
cnt_b = cnt_sqr(r, c, board, 'B') # 체스판의 시작칸이 'B'인 경우
if cnt_b < min_b: # 기존 최소값보다 새로 계산한 값이 더 작으면 최소값 갱신
min_b = cnt_b
cnt_w = cnt_sqr(r, c, board, 'W') # 체스판의 시작칸이 'W'인 경우
if cnt_w < min_w: # 기존 최소값보다 새로 계산한 값이 더 작으면 최소값 갱신
min_w = cnt_w
print(min(min_b, min_w)) # 'B' 시작, 'W' 시작 둘 중 더 작은 값을 출력