PS/브루트포스 알고리즘[Bruteforce]

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

SeungbeomKim 2022. 9. 20. 01:38
반응형

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

<코드>

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;




int M, N;

char board[51][51];

char wb[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 bw[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'
};

int white_first(int x, int y) {
	int result = 0;
	for (int i = 0; i < 8; i++) {
		for (int j = 0; j < 8; j++) {
			if (board[x + i][y + j] != wb[i][j])
				result++;
		}
	}
	return result;
}

int black_first(int x, int y) {
	int result = 0;
	for (int i = 0; i < 8; i++) {
		for (int j = 0; j < 8; j++) {
			if (board[x + i][y + j] != bw[i][j])
				result++;
		}
	}
	return result;
}
int main()
{
    cin>>N>>M;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            cin>>board[i][j];
        }
    }
    int minresult = 123456789;
    for(int i = 0; i + 8 <= N; i++)
    {
        for(int j = 0; j + 8 <= M; j++)
        {
            int res;
            res = min(white_first(i,j),black_first(i,j));
            if(res < minresult) {
                minresult = res;
            }
        }
    }
    cout<<minresult<<'\n';
}

모든 경우의 수를 조사하는 브루트포스 알고리즘 문제이다. 우선적으로 wb, bw 배열은 흰색이 먼저오는것과 검은색이 먼저오는것의 배열을 미리 8*8로 만들어주었다.  흰색이 먼저인 경우와 검은색이 먼저인 경우를 비교해 값이 더 작은 것을 매 검사마다 갱신해줘야 한다.

<코드 참조>

https://codesyun.tistory.com/83

 

[BOJ / 백준] 1018번 체스판 다시 칠하기 C++ 문제 풀이

단계별로 풀어보기 - 브루트 포스 단계 - [4단계] 1018번 문제 문제 링크 : www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나..

codesyun.tistory.com

 

반응형