백준 1018번 바로가기
나의 풀이#
score = []
chess = []
n, m = map(int, input().split())
for _ in range(n):
chess.append(input())
for x in range(n-7):
for y in range(m-7):
W_start = 0
B_start = 0
for i in range(x, x+8):
for j in range(y, y+8):
if (i+j) % 2 == 0:
if chess[i][j] != "W":
W_start += 1
else:
B_start += 1
else:
if chess[i][j] != "W":
B_start += 1
else:
W_start += 1
score.append(B_start)
score.append(W_start)
print(min(score))
CODE REVIEW#
- 처음에는 브루트포스로 일일히 확인하는 방법을 확인하려했다.
- 마치 옛날 컴퓨터가 나오기 이전의 OMR 체크 방식처럼 정답틀을 놓고
맞은문제/틀린문제
갯수 세는 것처럼 padding을 1로 놓고 정답 필터를 움직이며 답을 확인하려했다.
- 하지만 이 방식은 크기가 커지면 커질수록 연산 횟수가 기하급수적으로 늘어서 비효율적이고 당연히 시간 초과…
- ML에서는 그냥 컴퓨터를 혹사시켜서 이 방식을 택하긴 하지만 ㅋㅋ
- 도저히 풀이 방법이 생각이 안나서 일주일 정도 붙잡고 있었던 것 같다.
- 홀짝성 이용하자는 생각이 들었지만 구현하는 방법이 생각이 나지 않아서 다른 포스팅들을 참고했다… 하하… 아직 실력이 부족한듯 많이 배워야겠다.
- 위치를 (i,j)라고 하면 i+j이 짝수인 경우 “W"만족, 홀수인 경우 “B"만족 OR 짝수인 경우 “B"만족, 홀수인 경우 “W"만족 경우로 나누어 횟수를 세고, 최솟값은 print한다.