[BOJ] 1018 "체스판 다시 칠하기" 문제 풀이 & 소스 코드 With C/C++

반응형
반응형

#INFO

난이도 : SILVER5

알고리즘 유형 : BruteForce

출처 : 1018번: 체스판 다시 칠하기 (acmicpc.net)

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net


#SOLVE

모든 경우의 수를 대입하는 브루트포스 알고리즘을 이용해 문제를 풀이하였습니다.

우선, 맨 앞이 검정으로 시작하는 8 x 8 타일 black_board와 하얀색으로 시작하는 8 x 8 타일 white_board 를 string 배열을 이용해 선언해 줍니다.

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

 

다음으로 N * M 타일 보드의 값과 black_board의 값을 비교하는 B_CNT 함수와 white_board의 값을 비교하는 W_CNT 함수를 선언합니다.

B_CNT, W_CNT 함수는 N * M 보드에서 좌표값을 받아와 순차적으로 탐색을 진행하여 서로 다른 값이 존재하면 cnt 값을 증가시키는 기능을 수행합니다.

예를들어 3 * 3 타일의 black_board와 5 * 5 타일의 보드를 B_CNT 함수로 비교한다고 가정 시 , 서로 다른 색깔이 총 7개가 존재하기에, 7의 값을 리턴합니다.

int B_Cnt (int x, int y) {
	int cnt = 0;
	for (int i = 0 ; i < 8 ; i++) {
		for (int j = 0 ; j < 8 ; j++) {
			if (black_board[i][j] != board[i+x][j+y]) 
				cnt++;
		}
	}
	return cnt;
}

int W_Cnt (int x, int y) {
	int cnt = 0;
	for (int i = 0 ; i < 8 ; i++) {
		for (int j = 0 ; j < 8 ; j++) {
			if (white_board[i][j] != board[i+x][j+y])
				cnt++;
		}
	}
	return cnt;
}

 

메인 함수에서는 모든 경우의 수를 탐색해 B_Cnt와 W_Cnt의 리턴값 중 더 작은 값을 min_val 변수에 초기화 시키면 됩니다.

	int min_val = 10000;
	for (int i = 0 ; i <= N - 8 ; i++) {
		for (int j = 0 ; j <= M - 8 ; j++) {
			int temp = min(B_Cnt(i, j), W_Cnt(i, j));
			if (temp < min_val)
				min_val = temp;
		}
	}

#CODE

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

char board[51][51];

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

int B_Cnt (int x, int y) {
	int cnt = 0;
	for (int i = 0 ; i < 8 ; i++) {
		for (int j = 0 ; j < 8 ; j++) {
			if (black_board[i][j] != board[i+x][j+y]) 
				cnt++;
		}
	}
	return cnt;
}

int W_Cnt (int x, int y) {
	int cnt = 0;
	for (int i = 0 ; i < 8 ; i++) {
		for (int j = 0 ; j < 8 ; j++) {
			if (white_board[i][j] != board[i+x][j+y])
				cnt++;
		}
	}
	return cnt;
}

int main(){
	int N,M;
	cin >> N >> M;
	for (int i = 0 ; i < N ; i++) {
		for (int j = 0 ; j < M ; j++) {
			cin >> board[i][j];
		}
	}
	
	int min_val = 10000;
	for (int i = 0 ; i <= N - 8 ; i++) {
		for (int j = 0 ; j <= M - 8 ; j++) {
			int temp = min(B_Cnt(i, j), W_Cnt(i, j));
			if (temp < min_val)
				min_val = temp;
		}
	}
	
	cout << min_val << endl;
	return 0;
}

반응형

댓글

Designed by JB FACTORY