BEAKJOON

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

Shin_jisoo 2021. 1. 17. 20:17
728x90

www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

1) 주석 없는 VERSION

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <utility>
#include <string>
#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"
};

string board[50];

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

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


int main() {
	int size[2];
	int cnt;
	int min_val = 12345;
	pair<int, int>p1;

	cin >> p1.first >> p1.second;

	for (int i = 0;i < p1.first;i++) {
		cin >> board[i];
	}

	for (int i = 0;i + 8 <= p1.first;i++) {
		for (int j = 0;j + 8 <= p1.second;j++) {
			int tmp;
			tmp = min(WB_cnt(i, j), BW_cnt(i, j));
			if (tmp < min_val) {
				min_val = tmp;
			}
		}
	}

	cout<<min_val;
	return 0;
}

 

2) 주석 있는 VERSION

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <utility>
#include <string>
#include <algorithm>

using namespace std;

// W부터 시작하는 경우의 체스판
string WB[8] = {
		"WBWBWBWB",
		"BWBWBWBW",
		"WBWBWBWB",
		"BWBWBWBW",
		"WBWBWBWB",
		"BWBWBWBW",
		"WBWBWBWB",
		"BWBWBWBW"
};

// B부터 시작하는 경우의 체스판
string BW[8]{
		"BWBWBWBW",
		"WBWBWBWB",
		"BWBWBWBW",
		"WBWBWBWB",
		"BWBWBWBW",
		"WBWBWBWB",
		"BWBWBWBW",
		"WBWBWBWB"
};

// 입력값으로 받아올 보드
string board[50];

// W부터 시작하는 경우에 WB 보드와 비교
int WB_cnt(int x, int y) {
	int cnt = 0;
	for (int i = 0;i < 8;i++) {
		for (int j = 0;j < 8;j++) {
			
			// 다른 것이 있는 경우 count 세기
			if (board[x + i][y + j] != WB[i][j]) {
				cnt++;
			}
		}
	}
	return cnt;
}

// B부터 시작하는 경우에 BW 보드와 비교
int BW_cnt(int x, int y) {
	int cnt = 0;
	for (int i = 0;i < 8;i++) {
		for (int j = 0;j < 8;j++) {

			// 다른 것이 있는 경우 count 세기
			if (board[x + i][y + j] != BW[i][j]) {
				cnt++;
			}
		}
	}
	return cnt;
}


int main() {
	int size[2];
	int cnt;
	int min_val = 12345;
	pair<int, int>p1;

	cin >> p1.first >> p1.second;

	// 행의 개수만큼 입력 받기
	for (int i = 0;i < p1.first;i++) {
		cin >> board[i];
	}

	for (int i = 0;i + 8 <= p1.first;i++) {
		for (int j = 0;j + 8 <= p1.second;j++) {
			int tmp;

			// W부터 시작하는 경우와 B부터 시작하는 경우의 수 중
			// 더 작은 숫자 리턴
			tmp = min(WB_cnt(i, j), BW_cnt(i, j));
			if (tmp < min_val) {
				min_val = tmp;
			}
		}
	}

	cout<<min_val;
	return 0;
}