백준 1018번 - 체스판 다시 칠하기 [24]
문제 유형 : 브루트포스
문제
-
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 MN 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 88 크기의 체스판으로 만들려고 한다.
-
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
-
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 88 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 88 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
제한사항
-
입력
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
-
출력
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
해결방법
- 맨위가 흰색이여야 한다는 가정하에 다른 색깔로 칠해야하는 사각형들을 구해 arr배열에 1로 설정한다.
- 88의 보드로 나누어 88칸에서 다른색깔로 칠해야 하는 사각형들의 개수를 구해 최소, 최대의 칠해야하는 사각형의 개수를 구한다.
- 최소인 경우 (맨위가 흰색인경우) vs 64-최대 (맨위가 검은색인경우) 중에 작은것이 결과이다. (결과 : 지민이가 다시 칠해야 하는 정사각형 개수의 최소값)
참고
오랜만에 알고리즘 문제를 풀어서 입력방법부터 찾아보았다.
-
이차원 리스트 초기화 및 입력
m,n = map (int, input().split()) board = [input() for _ in range(m)]출처 : https://paris-in-the-rain.tistory.com/72
-
파이썬 삼항연산자 사용법
- ex)
print("짝수" if num % 2 == 0 else "홀수") - 출처 : https://wikidocs.net/20701
- ex)
solution
m,n = map (int, input().split())
board = [input() for _ in range(m)]
#2차원 리스트 입력
arr = [[0] *n for _ in range(m)]
# print(board)
count =0
#맨위가 흰색인경우를 count
for i in range(0,m):
for j in range(0,n):
if (i+j)%2 == 0: #짝수이면 맨위의 색깔과 같아야한다.
if(board[i][j]=='B'): #맨위의 색깔과 다르면 카운트
arr[i][j] = 1
count+=1
else: #홀수이면
if(board[i][j]=='W'): #다르면
arr[i][j] = 1
count+=1
min_count = 64;
max_count = 0;
for i in range(0,m-7):
m_count = 0
for j in range(0,n-7):
if j == 0:
m_count = 0
for k in range(i,i+8):
for l in range(j,j+8):
m_count+=arr[k][l]
else:
minus = 0
plus = 0
for k in range(i,i+8):
minus += arr[k][j-1]
plus += arr[k][j+7]
m_count = m_count-minus+plus
# print("i = ", i,"j = ", j, "m_count = ", m_count)
min_count = m_count if min_count > m_count else min_count
max_count = m_count if max_count < m_count else max_count
result = min_count if min_count < 64-max_count else 64-max_count
print(result)
# print(arr)
image
