[백준 1018] 체스판 다시 칠하기 / 파이썬

권한·2025년 12월 28일

BOJ

목록 보기
25/40

MxN크기의 보드를 8x8크기의 체스판으로 만들려고한다. 체스판은 흰색과 검은색이 번갈아서 칠해져야하며, 변을 공유하는 두개의 사각형은 다른 색으로 칠해져 있어야 한다. 체스판을 색칠하는 경우는 맨 왼쪽 위칸이 흰색인 / 검은색인 경우이다. 다시 칠해야하는 정사각형의 최소 개수를 구하는 프로그램을 작성하라 —가 문제이다.
브루트포스 알고리즘이라고 힌트를 주니,, 모든 경우를 확인해야 할 것 같다.

아이디어는
1. 크기와 보드의 각 행의 상태를 받는다.
2. 맨 왼쪽 위칸이 흰색/검은색인 경우에 대해 8x8씩 확인을 하고, 칠해야할 개수를 저장한다.

  • 8x8씩 확인은 중첩for로, 범위는 인덱스가 N을 벗어날 것을 고려해서 각각 N - 7, M = 7로 한다.
  • 맨 왼쪽 위칸이 흰색인 경우 i + j가 홀수일 때 검은색, 짝수일 때 흰색이 되어야한다.
    맨 왼쪽 위칸이 검은색인 경우 i + j가 홀수일 때 흰색, 짝수일 때 검은색이 되어야한다.
  • 4중첩 for문으로, 중첩for으로 8x8 칸 제한(첫 열의 위치), 중첩for문으로 제한된 만큼을 순회하며 색상을 확인한다. board[i][j]가 되어야 하는 값이 아니면 색칠카운트에 +1을 해준다.
  1. 저장한 값들 중 최솟값을 찾아 출력한다.
import sys
input = sys.stdin.readline

N, M = map(int, input().split()) #N 행개수, M 열개수
board = [ input() for line in range(N) ]
drawCount = []

for row in range(N - 7): #첫행 위치 제한
    for col in range(M - 7): #첫열 위치 제한
        Bdraw = 0
        Wdraw = 0

        for i in range(row, row + 8): 
            for j in range(col, col + 8):
                if (i + j) % 2 == 0:
                    if board[i][j] != 'B':
                        Bdraw += 1
                    if board[i][j] != 'W':
                        Wdraw += 1
                else:
                    if board[i][j] != 'W':
                        Bdraw += 1
                    if board[i][j] != 'B':
                        Wdraw += 1

        drawCount.append(Bdraw)
        drawCount.append(Wdraw)
print(min(drawCount))
profile
티스토리로 옮김

0개의 댓글