백준 1018

HR·2022년 4월 4일
0

알고리즘 문제풀이

목록 보기
3/50

백준 1018 : 체스판 다시 칠하기

  1. 시작이 W인 경우의 체스판, 시작이 B인 경우의 체스판을 각각 미리 입력해놓기

  2. 입력받은 배열을 8X8로 잘라서 1번에서 만들어놓은 두 체스판들과 비교

  3. 색이 다를때마다 count를 해서 가장 작은 경우 출력

정답 코드

#include <iostream>

using namespace std;

int N, M;
string in[51], cand[51];
int ans=2500;

int intoBW(string bw[8], string in[50]) {
	int count=0;
	
	for(int i=0; i<8; i++) {
		for(int j=0; j<8; j++) {
			if(bw[i][j] != in[i][j]) {
				count++;
			}
		}
	}
	
	return count;
}

int intoWB(string wb[8], string in[50]) {
	int count=0;
	
	for(int i=0; i<8; i++) {
		for(int j=0; j<8; j++) {
			if(wb[i][j] != in[i][j]) {
				count++;
			}
		}
	}
	
	return count;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	string bw[8] =  {
		"BWBWBWBWBW",
		"WBWBWBWBWB",
		"BWBWBWBWBW",
		"WBWBWBWBWB",
		"BWBWBWBWBW",
		"WBWBWBWBWB",
		"BWBWBWBWBW",
		"WBWBWBWBWB"		
	};
	
	string wb[8] = {
		"WBWBWBWBWB",
		"BWBWBWBWBW",
		"WBWBWBWBWB",
		"BWBWBWBWBW",
		"WBWBWBWBWB",
		"BWBWBWBWBW",
		"WBWBWBWBWB",
		"BWBWBWBWBW"
	};
	
	
	cin>>N>>M;
	
	for(int i=0; i<=N; i++) {
		getline(cin, in[i]);
	}
	
	for(int i=0; i<=N-8; i++) {
		for(int j=0; j<=M-8; j++) {
			for(int k=0; k<8; k++) {
				cand[k] = in[i+k+1].substr(j, j+8);
			}
			
			int a=intoBW(bw, cand);
			int b=intoWB(wb, cand);
			
			if(min(a, b) < ans) {
				ans = min(a, b);
			}
		}
	}
	
	
	cout<<ans<<"\n";
	
	
	return 0;
}

0개의 댓글