공부/알고리즘

[단계별로 풀어보기][python 3] 브루트 포스 - 체스판 다시 칠하기 (1018)

도리암 2022. 4. 30. 15:10

1018번: 체스판 다시 칠하기 (acmicpc.net)

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

시도 1

입력받은 체스판을 그대로 8개씩 잘라서 실제로 체크무늬로 만들어보고 바꾼 수만큼 카운트를 했다.

import copy

def chess(b: list):
    count = 0
    for x in range(7):
        if b[0][x] == b[0][x+1]:
            b[0][x+1] = 'W' if b[0][x+1] == 'B' else 'B'
            count += 1
    for x in range(8):
        for y in range(7):
            if b[y][x] == b[y+1][x]:
                b[y+1][x] = 'W' if b[y+1][x] == 'B' else 'B'
                count += 1
    return count

n, m = map(int, input().split())
first = []
for i in range(n):
    first.append(list(input()))
count = []

for y in range(n-7):
    for x in range(m-7):
        temp = []
        for i in range(8):
            temp.append(copy.deepcopy(first[i][x:x+8]))
        count.append(chess(temp))

print(min(count))

결과는 틀렸다 아무래도 최솟값을 찾지 못한 모양.

시도 2

이번에는 실제로 바꾸지 않고, 시작지점의 색깔과 같은지 다른지를 비교하는 방식으로 선언해보았다.

n, m = map(int, input().split())
first = []
for i in range(n):
    first.append(input())

countA= []
for i in range(m-7):
    for j in range(n-7):
        count = 0
        for x in range(i, i+8):
            for y in range(j, j+8):
                if (x+y) % 2 != 0:
                    if first[y][x] != first[j][i]:
                        count += 1
                else:
                    if first[y][x] == first[j][i]:
                        count += 1 
        countA.append(count)

print(min(countA))

이 방법도 시도 1과 마찬가지로 최솟값을 찾지 못해 실패했다.

시도 3

최솟값을 찾기 위해 시작지점이 W일 때와 B일 때를 구분했다.

n, m = map(int, input().split())
first = []
for i in range(n):
    first.append(input())

countA= []
for i in range(m-7):
    for j in range(n-7):
        countW = 0
        countB = 0
        for x in range(i, i+8):
            for y in range(j, j+8):
                if (x+y) % 2 != 0:
                    if first[y][x] == 'W':
                        countW += 1
                    elif first[y][x] == 'B':
                        countB += 1
                else:
                    if first[y][x] == 'B':
                        countW += 1 
                    elif first[y][x] == 'W':
                        countB += 1
        countA.append(min(countW, countB))

print(min(countA))