Notice
Recent Posts
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
관리 메뉴

이우의 개발일지

[C/C++] 백준 1018번 체스판 다시 칠하기 - (1) 본문

Coding

[C/C++] 백준 1018번 체스판 다시 칠하기 - (1)

공대이우 2024. 10. 7. 07:42

백준 1018번 체스판 다시 칠하기 문제

 

 

이 문제는 체스판 같은 N*N 판이나 일반적인 N*M의 표를 공략하는 문제가 있을 때 쓰면 좋을 것 같은 팁이 있다.

 

 

위의 표를 보면 B와 W가 번갈아 칠해져야하며, 위 아래 역시 번갈아 칠해져있어야 한다.

빨간 색 부분의 숫자를 보면 결국에는 행과 열의 합이 일정하다. 이 말이 무슨 말이냐면 행과 열의 합이 (0,0)이 만약에 B라고 했을 때 행과 열의 합이 항상 짝수일 때는 B가 나온다. 반대로 (0,1)이 W라고 하면 행과 열의 합이 항상 홀수가 나온다.

 

즉, B와 W처럼 일정한 간격으로 입력해야할 때 행과 열의 합이 짝수인지 홀수 인지 맞춰서 해주면 된다.

 

체스판 다시칠하기 전체 코드

#include <iostream>

using namespace std;
char chass[51][51];
//int real[51][51];
int main() {

	int N, M;
	cin >> N >> M;
	
	int minn = 1000000;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			char ch1;

			cin >> ch1;

			chass[i][j] = ch1;
		}
	}

	

	for (int p = 1; p <= N - 7; p++) {
		for (int o = 1; o <= M - 7; o++) {
			for (int k = 0; k < 2; k++) {
				int result = 0;

				char expected_2;
				char expected_1;

				if (k == 0) {
					expected_2 = 'W';
					expected_1 = 'B';
				}
				else {
					expected_2 = 'B';
					expected_1 = 'W';
				}

				for (int i = p; i <= p + 7; i++) {

					for (int j = o; j <= o + 7; j++) {
						if ((i + j) % 2 == 0) {
							if (chass[i][j] != expected_1) result++;
						}
						else if ((i + j) % 2 == 1) {
							if (chass[i][j] != expected_2) result++;
							
						}
					}
					
				}
				if (result < minn) minn = result;
			}
		}
		

		
	}
	cout << minn;
	return 0;
}

 

반응형