알고리즘 공부(C++)

1018 체스판 다시 칠하기

혀니리리 2022. 8. 22. 16:17
728x90

1018번: 체스판 다시 칠하기 (acmicpc.net)

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.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