## solution
M x N 보드가 주어질때 8x8로 잘라서 체스판으로 만들려고 한다.
칠해야 하는 정사각형의 최소 개수를 구하는 프로그램 작성.
문제 예시로 여러가지 경우를 체크해야한다는것은 알았는데, 모퉁이 4개를 기준으로 다 체크해야 한다는것은 놓쳤다.
어느 모퉁이를 기준으로 잡느냐에 따라서 색칠해야되는 값이 달라지고, 이걸 체크하지 않는다면 최소값이 나오지 않을수도 있다.
## CODE
```python
import sys
# 입력
lines = sys.stdin.readlines()
tmp_list = []
for idx in range(1,len(lines)):
lines[idx] = lines[idx].replace('\n','').replace('\x1a','')
tmp_list += [lines[idx]]
# 체크할 8*8 바둑판의 시작점을 잡는다
start_point = []
for start_idx in range(len(tmp_list)-7):
for start_idx2 in range(len(tmp_list[start_idx])-7):
start_point += [(start_idx,start_idx2)]
# 한 줄 단위로 시작점부터 비교한다
cmp1 = 'WBWBWBWB'
cmp2 = 'BWBWBWBW'
cnt_list = []
for a,b in start_point:
cnt = 0
for add_a in range(8):
# 처음 나오는 문자 기준으로 바둑판의 형태 잡고 비교
if tmp_list[a][b] == 'W':
if add_a % 2 == 0:
cmp = cmp1
else:
cmp = cmp2
else :
if add_a % 2 == 0:
cmp = cmp2
else:
cmp = cmp1
for add_b in range(8):
if tmp_list[a+add_a][b+add_b] != cmp[add_b]:
cnt += 1
cnt_list += [cnt]
cnt = 0
# 맨 끝의 문자를 기준으로 하면 처음을 기준으로 할때와 결과가 달라질수 있다.
for add_a in range(8):
if tmp_list[a+7][b+7] == 'W':
if add_a % 2 == 0:
cmp = cmp1
else:
cmp = cmp2
else :
if add_a % 2 == 0:
cmp = cmp2
else:
cmp = cmp1
for add_b in range(8):
if tmp_list[a+add_a][b+add_b] != cmp[add_b]:
cnt += 1
cnt_list += [cnt]
cnt = 0
# 첫줄 맨 끝의 문자
for add_a in range(8):
if tmp_list[a][b+7] == 'W':
if add_a % 2 == 0:
cmp = cmp2
else:
cmp = cmp1
else :
if add_a % 2 == 0:
cmp = cmp1
else:
cmp = cmp2
for add_b in range(8):
if tmp_list[a+add_a][b+add_b] != cmp[add_b]:
cnt += 1
cnt_list += [cnt]
cnt = 0
# 마지막줄 처음 문자
for add_a in range(8):
if tmp_list[a+7][b] == 'W':
if add_a % 2 == 0:
cmp = cmp2
else:
cmp = cmp1
else :
if add_a % 2 == 0:
cmp = cmp1
else:
cmp = cmp2
for add_b in range(8):
if tmp_list[a+add_a][b+add_b] != cmp[add_b]:
cnt += 1
cnt_list += [cnt]
print(min(cnt_list))
```
input받을때와 모퉁이 4개를 체크하는 경우에서 코드를 줄일수 있을것으로 보이는데. 문제푸는데 너무 오래걸렸다...
```python
f=open(0).read().split('\n')
r,c=f[0].split(' ')
f=f[1:]
w="WBWBWBWB"
b="BWBWBWBW"
sett=(w+b)*4
temp=""
result=0
minx=64
def comp(a,b):
r=0
for x,y in zip(a,b):
if x!=y:
r+=1
return r
for i in range(int(r)-7):
for j in range(int(c)-7):
for k in range(8):
temp+=f[i+k][j:j+8]
result=comp(temp,sett)
temp=''
minx=min([result,64-result,minx])
print(minx)
```
알아들을만한 정답 코드중 짧은것
스스로 연습이 좀 필요하다고 느낀다. 백준 문제중 순서대로 풀기 문제는 어느정도 다 풀어서 자료구조 문제를 시도해보는게 좋을수도 있겠다. 몇 문제 더 풀면 실버 2로 올라갈듯 싶다.
0 댓글