BOJ) 1018번 cpp code

만약~ 문제에 감이 안 잡힌다면, 생각할 점 

1. 맨 처음 인덱스는 'W', 'B' 둘 중 하나다.

1.1 둘 중에 어떤 경우가 최소카운트가 나오는지 구해야한다.

1.2 N* M 에서 8 * 8 을 어떻게 쪼개서 최소 카운트를 확인하는지 생각한다.

 

헷갈리지 말아야할 것은

지금 위치가 w인지 b인지는 중요하지 않다는 것이다. 둘 중에 어떤게 와야 최소가 될지가 중요한것이다.

나는 이것을 간과해서 오래걸렸다. 

 

#include <iostream>
#include <algorithm> 
using namespace std;

int BoardCheck(int x, int y, char arr[][50]) {
    int countB = 0; // 'B'로 시작할 경우 필요한 변경 횟수
    int countW = 0; // 'W'로 시작할 경우 필요한 변경 횟수
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            // 현재 위치가 'B'이어야 하는지, 'W'이어야 하는지 결정
            if ((i + j) % 2 == 0) { // 'B'로 시작하는 체스판의 패턴
                if (arr[x + i][y + j] != 'B') countB++;
                if (arr[x + i][y + j] != 'W') countW++;
            } else { // 'W'로 시작하는 체스판의 패턴
                if (arr[x + i][y + j] != 'W') countB++;
                if (arr[x + i][y + j] != 'B') countW++;
            }
        }
    }
    return min(countB, countW);
}

int main() {
    int n, m;
    cin >> n >> m;
    char arr[50][50];

    // 2차원 배열에 보드 입력 받기
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }

    int minChange = 1000000; // 큰 수로 초기화 ( (50*50)2500보다 크게 )
    // 가능한 모든 8x8 보드에 대해 확인
    for (int i = 0; i <= n - 8; i++) {
        for (int j = 0; j <= m - 8; j++) {
            int count = BoardCheck(i, j, arr);
            if (count < minChange) minChange = count; // 최소 변경 횟수 업데이트
        }
    }

    cout << minChange << endl; // 결과 출력
    return 0;
}

 

8 * 8을 쪼갤 때는 이중 반복문에서 0에서 n-8 과 m-8까지 보내어서 시작지점만 함수 BoardCheck()으로 보내고 함수안에서 8*8 속을 카운트한다.

 

# 혼잣말

최소값 찾을 때는 괜히 if문으로 비교하지말고 min(x,y)를 사용해서 가독성을 높이자.