[Python] 백준 1018

eun·2024년 1월 17일

문제 1018

먼저 문제를 이해해보자.

  • 첫째줄에는 m x n의 행열 수가 주어진다.
  • 다음줄부터는 w, b 흰색 검정색의 보드의 각 색이 주어진다.
  • 우리가 만들고자하는 보드는 체스판처럼 두 색이 번갈아 놓이는 8 x 8 크기의 보드를 만드는 것이다.
  • 원하는 보드를 만들기 위해 다시 칠해야 하는 블럭의 최소 개수를 구하라.
# 1018

n, m = map(int, input().split())

board = []

for i in range(n):
    lst = list(map(str, input().rstrip()))
    board.append(lst)
    
# 정상적인 체스판 2개 만들기
w = "WB" * 4
b = "BW" * 4

startW = []
startB = []

for i in range(8):
    if i % 2 == 0:
        startW.append(w)
        startB.append(b)
    else:
        startW.append(b)
        startB.append(w)
        
cnt = 64

for i in range(n-7):
    for j in range(m-7):
        sw = 0
        sb = 0
        
        for k in range(8):
            for l in range(8):
                sw += int(board[i + k][j + l] != startW[k][l])
                
                sb += int(board[i + k][j + l] != startB[k][l])
        
        cnt = min(cnt, sw, sb)
        
        if cnt == 0:
            break
        
print(cnt)

위 문제는 시간이 오래 걸렸다. 문제를 어떤 방식으로 접근해야하는지에 대한 고민이 있었다.
정상적인 체스판을 먼저 만들어놓고 입력받은 board와 비교하는 방법을 택했다.
처음에는 cnt 값을 지정해주지 않아서 첫번째 8 * 8 사각형만으로 비교가 되어 어려움을 겪었다. 이는 cnt 값을 가장 큰 값인 64로 지정하니 해결되었다.

0개의 댓글