반응형

www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

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

int main(void) {
	int Col; int Row;
	cin >> Col >> Row;

	vector<char> chess(51,0);
	vector<vector<char>> chessSpace(51,vector<char>(51,0));
	vector<char> chess1(51, 0);
	vector<vector<char>> chessSpace1(51, vector<char>(51, 0));

	vector<char> compare(51, 0);
	vector<vector<char>> chessCompare(51, vector<char>(51, 0));
	int i, j;
	for (i = 0;i < 8;i++) {
		for (j = 0;j < 8;j++) {
			if (i + j == 0 || (i + j) % 2 == 0) {// 0 이거나 2의 배수
				chessSpace[i][j] = 'W';
				chessSpace1[i][j] = 'B';
			}
			else {
				chessSpace[i][j] = 'B';
				chessSpace1[i][j] = 'W';
			}
		}
	}
	for (i = 0;i < Col;i++) {
		for (j = 0;j < Row;j++) {
			char A;
			cin >> A;
			chessCompare[i][j] = A;
		}
	}
	int count = 0;
	int count1 = 0;
	int ai, aj;
	
	vector<int> counter;
	for (ai = 0;ai <= Col - 8;ai++) {
		for (aj = 0;aj <= Row - 8;aj++) {
			int bi = 0; int bj = 0;
			for (i = ai;i < ai + 8;i++) {
				for (j = aj;j < aj + 8;j++) {
					if (chessSpace[bi][bj] != chessCompare[i][j]) {
						count++;
					}
					if (chessSpace1[bi][bj] != chessCompare[i][j]) count1++;
					if (bj <= 8)bj++;
				}if(bi<=8)bi++;
				 bj = 0;
			}counter.push_back(count);
			counter.push_back(count1);
			count = 0;
			count1 = 0;
			 bi = 0; 
		}
	}
	int min = *min_element(counter.begin(), counter.end());
	cout << min;
	return 0;
}

너무 코드가 더럽다

 

이게 최선인가 싶다.

 

1. 비교할 체스판 2개 생성

2. 기준점을 바꿔가면서 목표 체스판과 비교 후 count push

3. 최솟값 출력

반응형

'BOJ' 카테고리의 다른 글

[BOJ 2531] 회전 초밥  (0) 2024.03.08
[BOJ 2146] 다리 만들기  (0) 2024.01.26
[백준 11758번] CCW  (0) 2021.04.30
[백준] 순열 & 조합 (Permutation & Combination)  (0) 2021.04.27
[백준 9012번] 괄호  (0) 2021.04.25

+ Recent posts