체스판을 차례차례 대보면서 가장 적게 칠하는 경우를 구하는 문제이다. 모든 경우를 돌려봐야하는 브루트 포스 문제다.
일단 8X8 체스판을 만들어 놓고 이동하면서 칠해야하는 개수를 세줘야 하기 때문에, 처음이 검은색으로 시작하는 체스판과 처음이 흰색으로 시작하는 체스판 두 개를 만들어놔야 한다.
일단 나는 8X8크기의 2차원 배열을 각각 모두 'W' 혹은 'B'로 초기화해서 만들고, 2중 for문으로 체스판을 만들었다.
하나하나 옮겨가면서 비교하려면 총 몇번을 비교할지가 중요하다. 길이가 8이기 때문에, 행을 따라서 N-7만큼 반복하고 열을 따라서 M-7만큼 반복해주면 된다. 그리고 8X8만큼 반복을 해주면서 미리 만들어둔 판과 다른 색이면 cnt를 1씩 더해준다. 최솟값을 구하기 위해서 min_cnt에 충분히 큰 수를 넣어준 뒤 min_cnt보다 더 작은 수가 들어오면 새로 갱신을 해준다.
##변수 선언 부분
N = M = 0
White_First_cnt = 0
Black_First_cnt = 0
min_cnt = 10000
##메인 함수 부분
if __name__ == "__main__":
N, M = map(int,input().split())
data = [[x for x in input()]for _ in range(N)] #data 입력
White_First = [['W' for _ in range(8)]for _ in range(8)] #비교할 체스판을 만들어준다.
Black_First = [['B' for _ in range(8)] for _ in range(8)]
for i in range(0, 8):
for j in range(0, 8):
if i % 2 == 0 and j % 2 == 1:
White_First[i][j] = 'B'
Black_First[i][j] = 'W'
elif i % 2 == 1 and j % 2 == 0:
White_First[i][j] = 'B'
Black_First[i][j] = 'W'
for i in range(0, N - 7): #N - 7번씩 판을 옮겨가면서 횟수를 구한다
for j in range(0, M - 7):
White_First_cnt = 0
Black_First_cnt = 0
for k in range(0, 8): #8X8판을 가지고 비교
for l in range(0, 8):
if data[i+k][j+l] != White_First[k][l]: #
White_First_cnt += 1
if data[i+k][j+l] != Black_First[k][l]:
Black_First_cnt += 1
if min_cnt > White_First_cnt: #최소 시행을 구해준다.
min_cnt = White_First_cnt
if min_cnt > Black_First_cnt:
min_cnt = Black_First_cnt
print(min_cnt)
군대에서 풀었을 때는 되게 어려워했었던 것 같은데, 그렇게 어렵지는 않은 문제였다. 오히려 파이썬을 쓴 지 그렇게 오래되지 않아서 입력방식에서 헤맸다.
'백준 문제풀이(파이썬) > 브루트 포스' 카테고리의 다른 글
백준 1436번 - 영화감독 숌 (0) | 2021.05.28 |
---|