728x90
1018번: 체스판 다시 칠하기 (acmicpc.net)
브루트포스 문제로, 조건이 다소 까다로웠던 문제..
N, M = map(int, input().split())
lst = []
count = []
for i in range(N):
lst.append(list(input()))
for a in range(N - 8 + 1):
for b in range(M - 8 + 1):
state = 0
state2 = 0
for i in range(a, a + 8):
for j in range(b, b + 8):
if (i + j) % 2 == 0:
if lst[i][j] != 'W':
state +=1
if lst[i][j] != 'B':
state2 +=1
else:
if lst[i][j] != 'B':
state +=1
if lst[i][j] != 'W':
state2 +=1
count.append(min(state, state2))
print(min(count))
8 * 8 크기로 잘라서 최대한 덜 칠하면서 체스판의 블랙/화이트가 반복되는 구조를 만족해야 했다.
어디를 기준으로 자를지는 모르기 때문에 가로, 세로 각각 N - 8 + 1 / M - 8 + 1만큼 for문을 돌려가면서 구해야했고..(이거까진 맞음)
근데 이거에서 이중 포문을 돌리는데 이 안에서 또 이중 포문을 돌려야하는거까진 몰랐음
그것도 큰 이중포문에서 주어진 a , b를 첫 인덱스로 시작해야 한다는 것을...
그리고 W,B를 번갈아 해서 그중 더 적합한 적은 개수를 구하는 것을
state1, state2 두가지 경우로 나눠서 둘 중에 min인 것으로 count배열에 넣고
그 count배열 중에서도 min인 최솟값으로 이중 최솟값을 구해야 햇음..
이런 문제는 이런 식으로 짠다는 것을 알아두자!
728x90
'알고리즘 공부(C++)' 카테고리의 다른 글
백준 1010 다리놓기 (0) | 2022.08.24 |
---|---|
백준 15649 N과 M(1) (0) | 2022.08.24 |
2477 참외밭 (0) | 2022.08.18 |
1181 단어 정렬 (0) | 2022.08.17 |
11650 좌표 정렬하기 (0) | 2022.08.16 |