코딩테스트 연습/백준

[백준] 1018번 : 체스판 다시 칠하기 in python 파이썬

슈퍼짱짱 2019. 10. 21. 13:21
반응형

파이썬으로 백준풀기 :: 1018 체스판 다시 칠하기



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




코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def check_BW(ex):
    cnt1 = 0
    for i in range(8):
        for j in range(8):
            i_ = (0 if i in [0,2,4,6else 1)
            j_ = (0 if j in [0246else 1)
            if (i_ == 0 and j_ == 0or (i_ == 1 and j_ == 1) :
                if ex[i][j] != "B": cnt1 += 1
            if (i_ == 0 and j_ == 1or (i_ == 1 and j_ == 0) :
                if ex[i][j] != "W": cnt1 += 1
 
    cnt2 = 0
    for i in range(8):
        for j in range(8):
            i_ = (0 if i in [0246else 1)
            j_ = (0 if j in [0246else 1)
            if (i_ == 0 and j_ == 0or (i_ == 1 and j_ == 1):
                if ex[i][j] != "W": cnt2 += 1
            if (i_ == 0 and j_ == 1or (i_ == 1 and j_ == 0):
                if ex[i][j] != "B": cnt2 += 1
 
    return min(cnt1, cnt2)
 
n, m = map(int, input().split())
= [list(input()) for i in range(n)]
check = list()
for i in range(n-7):
    for j in range(m-7) :
        ex = [z[(0+j):(8+j)] for z in s[(0+i):(8+i)]]
        check.append(check_BW(ex))
print(min(check))
cs




8 by 8 씩 바꿔야 하는 개수를 구하고, 가장 작은 수를 출력한다.


이 때, 다시 칠해야 하는 정사각형 개수는 크게 두 가지 경우로 구할 수 있는데


1) [0,0]에 B로 시작

2) [0,0]에 W로 시작

이 있다.


1) B로 시작할 때는 체스판의 행과 열이 모두 짝수번째 일 때 (인덱스는 0부터 시작)와 홀수 일 때가 B여야 하고,

행이 짝수, 열이 홀수 혹은 행이 홀수, 열이 짝수 일 때 W여야 한다.

2) W로 시작할 때는 그 반대이다.


따라서 2중 for문으로 i와 j가 홀수인지, 짝수인지 판단 후 if문으로 확인한다.

즉, 1) B로 시작 할 때 

i와 j가 모두 짝수짝수 or 홀수홀수 일 때는 B, i와 j가 반대일 때는 W 이며 

2) W로 시작 할 때는 그 반대이다.



반응형