반응형
파이썬으로 백준풀기 :: 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,6] else 1) j_ = (0 if j in [0, 2, 4, 6] else 1) if (i_ == 0 and j_ == 0) or (i_ == 1 and j_ == 1) : if ex[i][j] != "B": cnt1 += 1 if (i_ == 0 and j_ == 1) or (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 [0, 2, 4, 6] else 1) j_ = (0 if j in [0, 2, 4, 6] else 1) if (i_ == 0 and j_ == 0) or (i_ == 1 and j_ == 1): if ex[i][j] != "W": cnt2 += 1 if (i_ == 0 and j_ == 1) or (i_ == 1 and j_ == 0): if ex[i][j] != "B": cnt2 += 1 return min(cnt1, cnt2) n, m = map(int, input().split()) s = [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로 시작 할 때는 그 반대이다.
반응형
'코딩테스트 연습 > 백준' 카테고리의 다른 글
[백준] 2750번 수 정렬하기 in python 파이썬 (0) | 2019.11.02 |
---|---|
[백준] 1436번 영화감독 숌 in python 파이썬 (0) | 2019.11.01 |
[백준] 7568번 : 덩치 in python 파이썬 (0) | 2019.10.13 |
[백준] 2231번 : 분해합 in python 파이썬 (0) | 2019.10.12 |
[백준] 2798번 : 블랙잭 in python 파이썬 코드 & 설명 (0) | 2019.10.11 |