이우의 개발일지
[C/C++] 백준 1018번 체스판 다시 칠하기 - (1) 본문
백준 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;
}

'Coding' 카테고리의 다른 글
| [C/C++] 백준 1654번 랜선 자르기 / 이분 탐색 알고리즘 - (1) (1) | 2024.10.20 | 
|---|---|
| [C/C++] 백준 11651번 좌표 정렬하기2 -(1) (1) | 2024.10.08 | 
| [C/C++] 백준 줄 세우기 2252번 / 위상 정렬 알고리즘 (1) | 2024.09.30 | 
| [백준/C++] 잃어버린 괄호 풀이 1541번 /그리디/알고리즘/코딩테스트 - (1) (0) | 2024.08.05 | 
| [Anaconda] 콘다 가상환경 생성 및 실행 방법/ window(윈도우)/ cmd (0) | 2024.06.30 |