문제
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
출력
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
예제 입력 1
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
예제 출력 1
1
예제 입력 2
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB
예제 출력 2
12
예제 입력 3
8 8
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
예제 출력 3
0
예제 입력 4
9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW
예제 출력 4
31
예제 입력 5
10 10
BBBBBBBBBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBBBBBBBBB
예제 출력 5
0
예제 입력 6
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWWWB
BWBWBWBW
예제 출력 6
2
예제 입력 7
11 12
BWWBWWBWWBWW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBWWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
예제 출력 7
15
처음 이 문제를 접했을 때 어떻게 해야할 지 고민을 했었습니다. 어떻게 접근해야할지 모르겠다면 일단 브루트포스로 먼저 접근하는 것이 가장 필요하다고 생각했습니다. 위 문제에서 체스판은 8X8형태로 만들어져있으며 B부터 시작하는 체스판 아니면 W로 시작하는 체스판이기에 미리 체스판을 선언해주고 들어온 값과 비교를 통해서 확인하면 되겠다는 생각을 했습니다.
위 문제에서 가로가 10, 세로가 12이라면 2(10-8)번째 줄까지, 세로는 4(12-8)번째 줄까지 해당 값으로 부터 가로 세로 8개를 차지하는 배열과 체스판이 일치하는지를 확인합니다 countChess함수를 통해서 내부에서 해당 인덱스 위치로부터 가로 8개, 세로 8개를 chess 판과 비교하여 불일치하는 갯수는 함수 내 지역변수 cnt를 증가시켜줍니다. 함수에서 리턴으로 cnt 값을 출력해주고 , main함수에서 min(cnt(기존 cnt값), chess1판과 해당 값을 비교한 함수, chess2판과 해당 값을 비교한 함수)통해서 가장 작은 값을 cnt에 저장하도록 해줍니다
문제에서 요구하는 답은 최소값이기 때문에 cnt 값을 출력해주면 문제는 해결됩니다.
다양한 방법이 있겠지만 chess 판을 미리 설정해주어서 해당 값을 비교해주는 것이
잘 읽히는 코드라 생각하고 해결한 방식입니다.
import math
import sys
def countChess(problem,chess,row,col):
cnt = 0
for i in range (0,8):
for j in range (0,8):
if problem[i+row][j+col] == chess[i][j]:
pass
else:
cnt += 1
return cnt
cnt = math.inf
chess1 = [
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
]
chess2 = [
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'],
['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'],
]
r,c = map(int,input().split())
row = r-7
column = c-7
problem = []
for _ in range(r):
m = list(sys.stdin.readline().strip())
problem.append(m)
for i in range(0,row):
for j in range(0,column):
cnt = min(cnt, countChess(problem, chess1, i, j),countChess(problem, chess2, i, j))
print(cnt)
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 15829번 Hashing - Python (0) | 2023.03.02 |
---|---|
백준 2292번 벌집문제 - Python (0) | 2023.02.27 |
백준 1251번 단어나누기 - Python (0) | 2023.02.25 |
백준 9012번 괄호문제 - Python (0) | 2023.02.24 |
백준 2164번 카드2 - Python (0) | 2023.02.24 |