• [1018] 백준 : 체스판 다시 칠하기(C++)

    2020. 4. 27.

    by. 데롱디롱

    728x90

     

    * 접근한 방식
    - 8*8의 네모칸을 N*M의 네모 안에서 우측 혹은 하단으로 이동하며 검사
    - 8*8의 네모칸의 (0,0)가 B인지 W인지를 start변수에 저장한 후, 8*8안의 각각의 행과 열을 검사

    char start = board[i][j];

    (8*8사각형 기준)
    ☞ 행, 열은 8*8사각형의 행과 열을 의미)


    - 행이 짝수인 경우, 
       └ 열이 짝수면, start와 같아야함.
            따라서 start와 다른 경우 고쳐야하므로 num++
       └ 열이 홀수면, start와 달라야함.
            따라서 start와 같은 경우 고쳐야하므로 num++

    - 행이 홀수인 경우,
       └ 열이 짝수면, start와 달라야함.
            따라서 start와 같은 경우 고쳐야하므로 num++
       └ 열이 홀수면, start와 같아야함.
            따라서 start와 다른 경우 고쳐야하므로 num++

     

    * 생각하지 못한 점
    - (0,0)을 기준으로하여 나머지칸들을 고쳤으나 (0,0)만 고치면 되는 경우가 있을 수도 있음
       ☞ (0,0)이 'B이어야 할 때'와  'W이어야 할 때'의 경우의 수를 모두 세서,
           둘 중 작은 것을 그 8*8사각형에서의 최소 변화 횟수로 하자

     

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main() {
    int N, M;
    cin >> N >> M;
    vector<string> board(N);
    int result = 0;
    // 각 칸의 색 입력받기
    for (int i = 0; i < N; i++)
    {
    cin >> board[i];
    }
    // 8*8네모의 이동
    for (int i = 0; i <= N-8; i++)
    {
    for (int j = 0; j <= M - 8; j++)
    {
    char start = 'B';
    int num = 0;
    // 네모 안에 틀린색 개수 체크
    for (int r = 0; r < 8; r++)
    for (int c = 0; c < 8; c++)
    {
    if (r % 2 == 0)
    {
    if (c % 2 != 0)
    {
    if (start == board[i + r][j + c])
    num++;
    }
    else
    {
    if (start != board[i + r][j + c])
    num++;
    }
    }
    else
    {
    if (c % 2 != 0)
    {
    if (start != board[i + r][j + c])
    num++;
    }
    else
    {
    if (start == board[i + r][j + c])
    num++;
    }
    }
    }
    if (i == 0 && j == 0)
    result = num;
    else if (num < result)
    result = num;
    start = 'W';
    num = 0;
    // 네모 안에 틀린색 개수 체크
    for (int r = 0; r < 8; r++)
    for (int c = 0; c < 8; c++)
    {
    if (r % 2 == 0)
    {
    if (c % 2 != 0)
    {
    if (start == board[i + r][j + c])
    num++;
    }
    else
    {
    if (start != board[i + r][j + c])
    num++;
    }
    }
    else
    {
    if (c % 2 != 0)
    {
    if (start != board[i + r][j + c])
    num++;
    }
    else
    {
    if (start == board[i + r][j + c])
    num++;
    }
    }
    }
    if (num < result)
    result = num;
    }
    }
    // 다시 칠해야 하는 개수
    cout << result;
    }

     

    - 코드가 좀... 반복이 많이 되는 것 같은데, 나중에 이걸 줄여봐야겠다.

    profile
    데롱디롱

    희희.. (๑′ᴗ‵๑)

    '알고리즘 풀이 > 백준' 카테고리의 다른 글

    댓글