백준 문제풀이/구현

[백준] 1018 체스판 다시 칠하기 - python

peach_h 2023. 4. 3. 20:24

 

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

첫번째 난관, 8*8로 어떻게 잘라낼 것인가.

-> 반복문을 N-7 / M-7로 쪼개서 N-7부터 +8까지 이런식으로 반복문을 돌린다

 

두번째 난관, 카운트 어떻게 ?

처음엔 그냥 'W'인거 다 센다음에 64에서 빼서 그 차이만큼 카운트하려고 했으나 . .

개수만 문제가 아니라, W와 B가 번갈아 가면서 나와야함 !!

-> W로 시작할때랑 B로 시작할때를 따로 카운트함

 

실버4가 왜이렇게 어려운건데 !

 

카운트 구하기

행과 열의 합이 짝수면 -> 시작 지점과 같은 색이여야함

체스판에 이런 규칙이 있었다니 . . 정말 신기하다

 

이를 이용해서 W로 시작했을 때와 B로 시작했을 때를 구분해서 카운트 할 수 있음

1. W로 시작하고 행과 열이 짝수 -> W가 와야함 

2. W로 시작하고 행과 열이 홀수 -> B가 와야함

만약 다른 색이라면, 카운트를 올린다

 

N, M = map(int,input().split())
arr = [list(map(str,input())) for _ in range(N)]
cnts = []
for i in range(N-7):
    for j in range(M-7):
        # d1 = W로 시작할 때 / d2 = B로 시작할 때
        w_start, b_start = 0,0
        # 8칸씩 자르기
        for a in range(i, i+8):
            for b in range(j, j+8):
                # 행과 열의 합이 짝수 == 시작 지점과 같다
                if (a+b) % 2 == 0:
                    if arr[a][b] != 'B':
                        w_start += 1
                    if arr[a][b] != 'W':
                        b_start += 1
                # 행과 열의 합이 홀수 == 시작 지점과 다름
                else:
                    if arr[a][b] != 'W':
                        w_start += 1
                    if arr[a][b] != 'B':
                        b_start += 1
        cnts.append(w_start)
        cnts.append(b_start)
print(min(cnts))

'백준 문제풀이 > 구현' 카테고리의 다른 글

[백준] 2839 설탕 배달 - python  (0) 2023.04.05
[백준] 1436 영화감독 숌 - python  (1) 2023.04.05