백준 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

  1. 처음에는 브루트포스로 일일히 확인하는 방법을 확인하려했다.
    • 마치 옛날 컴퓨터가 나오기 이전의 OMR 체크 방식처럼 정답틀을 놓고 맞은문제/틀린문제 갯수 세는 것처럼 padding을 1로 놓고 정답 필터를 움직이며 답을 확인하려했다.
    • 하지만 이 방식은 크기가 커지면 커질수록 연산 횟수가 기하급수적으로 늘어서 비효율적이고 당연히 시간 초과…
    • ML에서는 그냥 컴퓨터를 혹사시켜서 이 방식을 택하긴 하지만 ㅋㅋ
  2. 도저히 풀이 방법이 생각이 안나서 일주일 정도 붙잡고 있었던 것 같다.
    • 홀짝성 이용하자는 생각이 들었지만 구현하는 방법이 생각이 나지 않아서 다른 포스팅들을 참고했다… 하하… 아직 실력이 부족한듯 많이 배워야겠다.
    • 위치를 (i,j)라고 하면 i+j이 짝수인 경우 “W"만족, 홀수인 경우 “B"만족 OR 짝수인 경우 “B"만족, 홀수인 경우 “W"만족 경우로 나누어 횟수를 세고, 최솟값은 print한다.