https://www.acmicpc.net/problem/1018
테스트 케이스도 다 맞고 내가 생각하기로는 분명히 다 검사 후 체크를 하는데 왜 틀렸습니다가 나오는지 궁금했다.
n , m = map(int, input().split())
chessboard = [[] * m ] * n
# 체스판의 값을 입력받음
for i in range(n) :
tmp_arr = list(input())
chessboard[i] = (tmp_arr)
# 체스판에서 바꾸어야 할 값이 몇개인지 찾는다.
tmp = 65
k = 0
l = 0
while(True) :
changeCount = 0
for i in range (4) :
qq = i * 2
for j in range (4) :
pp = j * 2
if (chessboard[k][l] == 'B') : # 체스판은 2개의 행이 반복되므로 이렇게 체크를 해주었다.
if (chessboard[qq + k][pp + l] == 'W') :
changeCount += 1
if (chessboard[qq + k][pp + 1 + l] == 'B') :
changeCount += 1
if (chessboard[qq + 1 + k][pp + l] == 'B') :
changeCount += 1
if (chessboard[qq + 1 + k][pp + 1 + l] == 'W') :
changeCount += 1
else :
if (chessboard[qq + k][pp + l] == 'B') :
changeCount += 1
if (chessboard[qq + k][pp + l + 1] == 'W') :
changeCount += 1
if (chessboard[qq + 1 + k][pp + l] == 'W') :
changeCount += 1
if (chessboard[qq + 1 + k][pp + 1 + l] == 'B') :
changeCount += 1
# print(k, l)
# 여기서 k과 l을 증가시켜주는데 전체 다 체크해주지 않아서 오류가 발생했던 것 같다.
# 예제에서는 파악이 되지 않아 임의로 체크해보았다.
if (tmp > changeCount) :
tmp = changeCount
if (l < m - 7) :
l += 1
if (l == m - 7) :
l = 0
k += 1
if (k > n - 8) :
break
print(tmp)
나는 문제의 정의에서 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우 를 생각해서 처음에 조건문으로 적어주었는데 그 말이 아니었다.
왼쪽 위 칸이 흰색이라고 가정한 경우에 얼마나 더 칠해주어야 하는지,
왼쪽 위 칸이 검정색이라고 가정한 경우에 얼마나 더 칠해주어야 하는지를 비교해 더 적은 수의 값을 얻어오면 되는 문제였다.
예)
8 8
WWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
내 코드의 출력 : 63
정답 : 1
n , m = map(int, input().split())
chessboard = [[] * m ] * n
# 체스판의 값을 입력받음
for i in range(n) :
tmp_arr = list(input())
chessboard[i] = (tmp_arr)
k = 0
l = 0
tmp2 = 65
while(True) :
changeCount_B = 0
changeCount_W = 0
for i in range (4) :
qq = i * 2
for j in range (4) :
pp = j * 2
if (chessboard[qq + k][pp + l] == 'W') :
changeCount_B += 1
if (chessboard[qq + k][pp + 1 + l] == 'B') :
changeCount_B += 1
if (chessboard[qq + 1 + k][pp + l] == 'B') :
changeCount_B += 1
if (chessboard[qq + 1 + k][pp + 1 + l] == 'W') :
changeCount_B += 1
if (chessboard[qq + k][pp + l] == 'B') :
changeCount_W += 1
if (chessboard[qq + k][pp + l + 1] == 'W') :
changeCount_W += 1
if (chessboard[qq + 1 + k][pp + l] == 'W') :
changeCount_W += 1
if (chessboard[qq + 1 + k][pp + 1 + l] == 'B') :
changeCount_W += 1
tmp = min(changeCount_W, changeCount_B)
if(tmp < tmp2) :
count_min = tmp
tmp2 = count_min
if (l < m - 7) :
l += 1
if (l == m - 7) :
l = 0
k += 1
if (k > n - 8) :
break
print(count_min)
오랜만에 문제를 푸니 그 와중에 코드를 조금 많이 번거롭게 짜 놓은 것 같다.
다음에 문제를 풀 때는 간결하게, 다른 사람이 볼 때도 쉽게 이해할 수 있게 짜도록 노력해야겠다.