https://www.acmicpc.net/problem/1018
##
주어지는 판 안에서 8*8 체스판을 만드는데
색칠된걸 바꾸는 숫자가 최소인 경우를 찾으면 된다.
문제에서 체스판 자체의 경우의수는 2가지라고 나와있기는 하다
##
import sys
input = sys.stdin.read
inp = list(map(lambda x:x.replace('\x1a',''),input().splitlines()))
x,y = map(int,inp[0].split())
inp = inp[1:]
line1 = ''
for i in range(y):
if i%2==0:
line1 += 'W'
else:
line1 += 'B'
line2 = line1[1:]
if line2[-1] == 'W':
line2 += 'B'
else:
line2 += 'W'
case1 = []
case2 = []
for i in range(x):
if i%2 ==0:
case1 += [line1]
case2 += [line2]
else:
case1 += [line2]
case2 += [line1]
cmp_min = 65
for a in range(0,x-7):
for b in range(0,y-7):
cmp1 = 0
cmp2 = 0
for i in range(8):
for j in range(8):
if inp[a+i][b+j] == case1[a+i][b+j]:
cmp1 += 1
if inp[a+i][b+j] == case2[a+i][b+j]:
cmp2 += 1
if cmp_min > cmp1:
cmp_min = cmp1
if cmp_min > cmp2:
cmp_min = cmp2
print(cmp_min)
처음에 8*8이 아닌 주어진 케이스 전체에서 몇개를 최소로 바꾸어야 흰색과 검은색이 번갈아 칠해지는 상태가 되는지로 문제를 잘못 읽어서
case 2개로 전체 판을 먼저 만들고 8*8을 잘라내면서 비교하는 식으로 풀었다
어쨌든 괜찮게 풀었다는 생각은 드는데 주어지는 판 안에서 8*8의 경우만 2개 case를 가지고 찾는다면 메모리가 좀더 적게 들지 않을까 싶다.
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))
이게 예전에 제출한 코드인데, 재채점되어서 틀렸다고 되어있네
0 댓글