서두르지 말고 쉬지 말자

백준 1018번 체스판 다시 칠하기(C++) 본문

코딩 공부/Baekjoon Problem Solving

백준 1018번 체스판 다시 칠하기(C++)

philos 2025. 1. 7. 20:55

문제 해결 전략 : 2가지 경우의 체스판 배열과 값을 N,M만큼 입력 받아서 보드판 벡터를 생성한 후, 2가지 경우의 보드판과 벡터를 비교한다. 이때, 모든 경우를 반복문을 사용해서 비교한다.

 

문제 해결 소감 : 문제 해결 시점으로부터 몇달전에도 문제 해결 아이디어는 동일하게 가지고 있었으나 배열을 이용해 코드로 구현하는 것에 어려움을 느꼈다. 그러나 마침내 구현 방법을 찾아냈다. C++primer로 2차원 배열을 학습한 후에 사고력이 더 좋아진 것 같다.

#include <iostream>
#include <vector>

int N, M; // 8보다 크거나 같고 50보다는 작음
char C;
int cnt = 0;
int minCnt = 3000; // 다 틀렸을 때 최댓값 2500보다 크게 설정
char board1[8][8] = {
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
};
char board2[8][8] = {
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
    {'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
    {'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
}; // B W B W ...
std::vector<std::vector<char>> mainboard; // N행 M열 무작위 판
std::vector<char> mainrow;

int main(void)
{

    std::cin >> N >> M;
    for (int i = 0; i < N; ++i)
    {

        for (int j = 0; j < M; ++j)
        {
            std::cin >> C;
            mainrow.push_back(C);
        }
        mainboard.push_back(mainrow);
        mainrow.clear(); //입력 받아서 N * M 보드판 생성
    }

    for (int k = 0; k < (N - 8) + 1; ++k)
    {
        for (int l = 0; l < (M - 8) + 1; ++l)
        {
            cnt = 0;
            for (int i = k; i < k + 8; ++i)
            {
                for (int j = l; j < l + 8; ++j)
                {
                    if (mainboard[i][j] != board1[i - k][j - l])
                        ++cnt;
                }
            }
            if (cnt < minCnt)
            {
                minCnt = cnt;
            }
        }
    } //보드1과 비교해서 최소값 찾기

    for (int k = 0; k < (N - 8) + 1; ++k) //행을 한칸씩 아래쪽으로 해서 비교
    {
        for (int l = 0; l < (M - 8) + 1; ++l)
        {
            cnt = 0;
            for (int i = k; i < k + 8; ++i) //열을 한칸씩 오른쪽으로 해서 비교
            {
                for (int j = l; j < l + 8; ++j)
                {
                    if (mainboard[i][j] != board2[i - k][j - l]) 
                        ++cnt;  //board와 비교는 행과열이 변하지 않고 비교해야되서
                }               //이를 위해 k와 l만큼 빼기(k,l만큼 변화하기 때문)
            } //체스판과 검사
            if (cnt < minCnt)
            {
                minCnt = cnt;
            }
        }
    } //보드 2와 비교해서 최솟값 찾기

    std::cout << minCnt; //최종 최솟값 출력

    return 0;
}
반응형