
처음 보면 엄청 당혹스러운 브루트 포스 문제다.
먼저, 브루트 포스(Brute force)는 말 그대로 무차별 대입을 뜻하며, 어떠한 규칙을 구하는 것이 아닌 모든 경우의 수를 따지는 방법이다.
모든 경우의 수를 따지다 보니
만약
이 문제는 빅-오 표기법(Big-O notation)의 감을 잡아주는 아주 좋은 문제다.
import sys
if __name__ == '__main__':
N, M = map(int, sys.stdin.readline().rstrip().split())
chess = list()
for _ in range(N):
chess.append(list(sys.stdin.readline().rstrip()))
min_square = 65
for i in range(N-7):
for j in range(M-7):
W_first, B_first = 0, 0
for k in range(8):
for l in range(8):
if (k+l)%2 == 0:
if chess[i+k][j+l] == 'B':
W_first += 1
else:
B_first += 1
else:
if chess[i+k][j+l] == 'W':
W_first += 1
else:
B_first += 1
min_square = min(min_square, W_first, B_first)
print(min_square)
먼저 큰 루프가 두개 있는데, 하나는
시작점 루프가 돌 때 마다 첫 원소가 'W'로 시작할 때의 고쳐야 하는 변수를 W_first, 'B'일 때를 B_first로 둔다.
그리고
주의해야 할 점은 W_first와 B_first는 시작점이 바뀔 때마다 초기화해야 하고, 시작점 마다의 W_first와 B_first를 구해서 min_square를 갱신해야 한다는 것이다.

min_square는 65로 설정해도 된다. 최대 수정 가능 횟수가 64이기 때문에 시작점의 루프를 한 번이라도 돈다면 min_square는 65보다 무조건 작아진다.
이 문제의 핵심은
즉, 최악의 계산 횟수는
여기서 43은
'Python > 백준 문제 풀이' 카테고리의 다른 글
[BOJ] 1309번 동물원 (0) | 2022.09.09 |
---|---|
[BOJ] 25487번 단순한 문제 (Large) (1) | 2022.09.07 |
[BOJ] 2447번 별 찍기 - 10 (0) | 2022.08.31 |
[BOJ] 12018번 Yonsei TOTO (0) | 2022.08.12 |
[BOJ] 10871번 X보다 작은 수 (0) | 2022.08.10 |
댓글