백준

백준 1018 C++

solfa 2023. 11. 18. 18:45

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

와 문제 이해를 못해서 하루종일 헤맨 문제...

그냥 어지간히 안풀린다 싶으면 문제 이해를 위해서라도 검색을 해보자 ㅎ

 

생각 

1. 비교를 할 WB / BW 체스판을 미리 만들어 두고 비교를 하자

2. 여기서 키포인트는 한 번만 비교를 하는게 아니라 움직여가면서 비교를 하는 것!

 

#include <iostream>
#include <algorithm>

using namespace std;

string WB[8] =
    {
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW"};

string BW[8] =
    {
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB"};

int main()
{
    int N, M, cnt_wb = 0, cnt_bw = 0;
    cin >> N >> M;
    char str[N][M];

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> str[i][j];
        }
    }

    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if (str[i][j] != WB[i][j])
                cnt_wb++;

            if (str[i][j] != BW[i][j])
                cnt_bw++;
        }
    }

    int result = min(cnt_wb, cnt_bw);

    if (result > 64)
        result = 64;

    cout << result;
}

이 코드는 한 번만 비교를 하도록 한 것이고 입력받은 체스판에서 가능한 모든 8x8 크기의 부분 체스판에 대해 비교해야함! -> 각 행/열 한 번씩 for문을 추가해주면 됨 

 

최종 코드

#include <iostream>
using namespace std;

string WB[8] =
    {
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW"};

string BW[8] =
    {
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB"};

int main()
{
    int N, M, result = 64;
    cin >> N >> M;
    char str[N][M];

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> str[i][j];
        }
    }

    for (int i = 0; i <= N - 8; i++)
    {
        for (int j = 0; j <= M - 8; j++)
        {
            int cnt_wb = 0, cnt_bw = 0; // 반복 여러번 돌려야 하니까 매번 0으로 초기화!!

            for (int x = 0; x < 8; x++)
            {
                for (int y = 0; y < 8; y++)
                {
                    if (str[i + x][j + y] != WB[x][y])
                        cnt_wb++;

                    if (str[i + x][j + y] != BW[x][y])
                        cnt_bw++;
                }
            }

            result = min(result, min(cnt_wb, cnt_bw)); // 마찬가지로 끝날 때마다 초기화!!
        }
    }

    cout << result;
    return 0;
}

 

 

+ 그냥 코드 깔끔하게 쓰는 법

int result = min(cnt_wb, cnt_bw);

    if (result > 64)
        result = 64;

 if문으로 비교를 했는데 그냥 min을 중첩시키면 더 간단할 듯!

result = min(result, min(cnt_wb, cnt_bw));

 

728x90

'백준' 카테고리의 다른 글

백준 2231 C++  (2) 2023.11.22
백준 7568 C++  (2) 2023.11.22
백준 9093 C++  (1) 2023.11.16
백준 1874번 C++  (1) 2023.11.15
백준 2805번 C++  (0) 2023.11.15