Algorithm/Algorithm Problem
백준 1018 체스판 다시 칠하기
땅지원
2021. 10. 13. 20:33
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
생각보다 어려워서 꼼꼼히 풀어보려고 블로그에 남긴다.
n,m = map(int,input().split())
board = []
count = []
for _ in range(n):
board.append(input())
for i in range(n-7):
for j in range(m-7):
black_paint = 0
white_paint = 0
for a in range(i,i+8):
for b in range(j,j+8):
if (a+b)%2==0:
if board[a][b]!='W':
black_paint +=1
if board[a][b]!='B':
white_paint +=1
else:
if board[a][b]!='B':
black_paint +=1
if board[a][b]!='W':
white_paint +=1
count.append(min(black_paint,white_paint))
print(min(count))
큰 직사각형 board를 받아오면 8x8의 고정된 정사각형을 먼저 다른다음에
체크무늬를 가장 적게 칠할 수 있는 경우를 구하는 것
일단 board를 list에 기억해두고 8x8로 잘라서 검사를 하는것이 중요하다고 생각하였다.
for i in range(n-7):
for j in range(m-7):
black_paint = 0
white_paint = 0
for a in range(i,i+8):
for b in range(j,j+8):
n-7,m-7로 하면 8x8로 자를때의 좌측상단의 시작점을 index 오류없이 시작할 수 있어서 저 방법을 선택하였고
8x8를 하기 위해 i+8, j+8를 하였다.
black_paint, white_paint는 좌측상단이 'W','B'로 시작할 경우 색칠한 체스판의 개수를 세기위한 변수이다.
if (a+b)%2==0:
if board[a][b]!='W':
black_paint +=1
if board[a][b]!='B':
white_paint +=1
else:
if board[a][b]!='B':
black_paint +=1
if board[a][b]!='W':
white_paint +=1
count.append(min(black_paint,white_paint))
리스트에 index의 합이 짝수와 홀수로 나눈경우가 체크무늬에 해당하기 때문에 저런 조건식을 넣어주면서
한개의 8x8 정사각형이 끝날때마다 작은값을 리스트에 넣고 마지막에 최종적으로 또 최소값을 출력해준다.