문제
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
import sys
N,M=map(int,sys.stdin.readline().split())
chess_board=[]
case1=0
case2=0
result=-1
for _ in range(N):
chess_board.append(list(sys.stdin.readline().rstrip()))
for x in range(N-7):
for y in range(M-7):
case1=0
case2=0
for a in range(x,x+8):
for b in range(y,y+8):
if((a%2==0 and b%2==0) or (a%2==1 and b%2==1)):
if(chess_board[a][b]=='W'):
case1+=1
else:
case2+=1
else:
if(chess_board[a][b]=='W'):
case2+=1
else:
case1+=1
if(result==-1 or result>min(case1,case2)):
result=min(case1,case2)
print(result)
※ 브루트 포스
● 가로 8칸, 세로 8칸의 판으로 쪼개야 하므로 x는 인덱스 0부터 N-8까지, y는 인덱스 0부터 M-8까지 순회하게 설정한다.
● 주어진 체스판을 8 x 8로 쪼갤 수 있는 모든 경우의 수를 순회하며 다시 칠해야 하는 칸의 개수를 센다.
● 이때 case1은 자른 체스판의 인덱스가 모두 홀수이거나 짝수인 칸은 B, 나머지 칸은 W이어야 할 때 바꿔 칠해야 하는 칸의 수
● case2는 자른 체스판의 인덱스가 모두 홀수이거나 짝수인 칸은 W, 나머지 칸은 B이어야 할 때 바꿔 칠해야 하는 칸의 수를 나타낸다.
● 확인이 끝나면 각 단계에서 case1과 case2 중 더 작은 값과 현재 result 값과 비교하여 두 값중 result 값이 더 크면 result를 min(case1,case2) 의 값으로 갱신해주면 된다!!
'백준(baekjoon) > 실버' 카테고리의 다른 글
백준(baekjoon) 2108번: 통계학(실버 3, 파이썬 PYTHON) - 정렬 (0) | 2022.09.05 |
---|---|
백준(baekjoon) 2751번: 수 정렬하기 2 (실버 5, 파이썬 PYTHON) - 정렬 (0) | 2022.09.04 |
백준(baekjoon) 11729번: 하노이 탑(실버 1, 파이썬 PYTHON) - 재귀 (0) | 2022.09.01 |
백준(baekjoon) 9020번: 골드바흐의 추측(실버 2, 파이썬 PYTHON) - 기본 수학2 (0) | 2022.09.01 |
백준(baekjoon) 1929번: 소수 구하기(실버 3, 파이썬 PYTHON) - 기본 수학2 (0) | 2022.09.01 |