For Programmer

백준 1018번 파이썬 문제풀이(브루트 포스- 체스판 다시 칠하기) 본문

코팅테스트/백준 문제 모음

백준 1018번 파이썬 문제풀이(브루트 포스- 체스판 다시 칠하기)

유지광이 2021. 10. 7. 16:36
728x90

 

코드

n, m = map(int, input().split())  # 행 * 열
array = []
result = []

for _ in range(n):
    a = input()
    b = list(map(str, a)) #문자열을 한단위씩 쪼개서 리스트에 대입("abc" -> "a","b","c")
    array.append(b)

for a in range(n-7): # 8 * 8의 개수가 나오는 경우의 수는 행의길이 - 7 * 열의길이 - 7 의 개수만큼 나온다.
    for b in range(m-7): # 8 * 8의 개수가 나오는 경우의 수는 행의길이 - 7 * 열의길이 - 7 의 개수만큼 나온다.
        countW = 0
        countB = 0
        for i in range(a, a+8):  # 행
            for j in range(b, b+8):  # 열
                if (i + j) % 2 == 0: #두 행과열의 인덱스를 더한값이 짝수라면 색은 다 일치해야됨
                    if array[i][j] != "W":  # (i + j) % 2 == 0위치에서 W를 칠해야하는 경우
                        countW += 1 
                    if array[i][j] != "B":  # (i + j) % 2 == 0위치에서 B를 칠해야하는 경우
                        countB += 1
                elif (i + j) % 2 != 0: #두 행과열의 인덱스를 더한값이 홀수라면 색은 다 일치해야됨
                    if array[i][j] != "B":  # 위의 조건 (i + j) % 2 == 0 부분에서 W이기 때문에 (i + j) % 2 != 0 위치에서 B가 아닐 경우 B를 칠해야하는 경우
                        countW += 1
                    if array[i][j] != "W":  # 위의 조건 (i + j) % 2 == 0 부분에서 B이기 때문에 (i + j) % 2 != 0 위치에서 W가 아닐 경우 W를 칠해야하는 경우
                        countB += 1
        result.append(countW) #각 8 * 8 체스판마다  (i + j) % 2 == 0위치에서 W를 색칠한 횟수 입력((i + j) % 2 != 0 위치에서는 B색칠)
        result.append(countB) #각 8 * 8 체스판마다  (i + j) % 2 == 0위치에서 B를 색칠한 횟수 입력((i + j) % 2 != 0 위치에서는 W색칠)

print(min(result)) #색칠한 횟수중 최소값 출력

-> 개인적으로 굉장히 어려운 문제였다. 브루트 포스문제 자체가 조건을 하나 실수하면 문제를 풀 수 없기 때문에 1시간을넘게 고민했다. 특히 M * N 체스판에서 8 * 8 체스판을 만들어 낼수 있는 경우의 수가 M-7 * N - 7  을 생각해내는 부분도 쉽지 않았으며 체스판의 인덱스마다 i+j 값이 짝수와 홀수로 나누어지는 부분도 생각하는 것이 쉽지 않았다. 여러모로 고난이도 문제라고 생각한다.

728x90
Comments