#50. [백준_C언어] 1018 : 체스판 다시 칠하기

 

 입력 코드 

#include <stdio.h>
#define minF(a,b) a<b? a:b

main() {
	int N, M;
	scanf("%d %d", &N, &M);
	
	char C[50][50];
	int min = 80;
	int cntB = 0, cntW = 0;

	for (int i = 0; i < N; i++) {
		scanf("%s", &C[i]);
	}

	for (int i = 0; i + 7 < N; i++) {
		for (int j = 0; j + 7 < M; j++) {
			cntB = 0;
			cntW = 0;
			for (int a = i; a < i + 8; a++) {
				for (int b = j; b < j + 8; b++) {
					if ((a + b) % 2 == 0) {
						if (C[a][b] == 'B')
							cntW++;
						else
							cntB++;
					}
					else {
						if (C[a][b] == 'B')
							cntB++;
						else
							cntW++;
					}
				}
			}
			min = minF(min, cntB);
			min = minF(min, cntW);
		}
	}
	printf("%d\n", min);
}

 

 코드 설명 

#브루트포스 알고리즘

main() {
	int N, M;
	scanf("%d %d", &N, &M);

	int C[52][52];
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%s", C[i][j]);
		}
	}

	int count = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (C[i][j] == C[i][j + 1])
				count++;
		}
	}

}

처음에는 뭘 어떻게 해야 할지 감도 안 왔다.

#include <stdio.h>
#include <string.h>

char white[8][8] = { "WBWBWBWB","WBWBWBWB","WBWBWBWB","WBWBWBWB",
"WBWBWBWB","WBWBWBWB","WBWBWBWB","WBWBWBWB" };
char black[8][8] = { "BWBWBWBW","BWBWBWBW","BWBWBWBW","BWBWBWBW",
"BWBWBWBW","BWBWBWBW","BWBWBWBW","BWBWBWBW" };

char C[52][52];

int whitefirst(int x, int y) {
	int count = 0;
	for (int i = x; i < x + 8; i++) {
		for (int j = y; j < y + 8; j++) {
			if (C[i][j] != white[i - x][j - y])
				count++;
		}
	}
	return count;
}

int blackfirst(int x, int y) {
	int count = 0;
	for (int i = x; i < x + 8; i++) {
		for (int j = y; j < y + 8; j++) {
			if (C[i][j] != black[i - x][j - y])
				count++;
		}
	}
	return count;
}

int min(int a, int b) {
	if (a >= b)
		return b;
	else
		return a;
}

main() {
	int N, M;
	int result;

	scanf("%d %d", &N, &M);

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%s", &C[i][j]);
		}
	}

	for (int i = 0; i + 7 < N; i++) {
		for (int j = 0; j + 7 < M; j++) {
			result = min(whitefirst(N, M), blackfirst(N, M));
		}
	}
	printf("%d", result);
}

① 그래서 찾아봤더니 처음 시작할 때 맨 왼쪽 위 칸이 흰색인 경우와 검은색인 경우를 정해놓고 두 가지 경우와 비교하면서 count를 세는 방법도 있고,

 

참고한 사이트

jaimemin.tistory.com/667

 

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

문제 링크입니다: https://www.acmicpc.net/problem/1018 체스판은 (0,0)에 W가 오는 경우가 있고 B가 오는 경우가 있습니다. 따라서 두 가지 경우의 체스판을 미리 선언해놓고 하나하나 Brute Force 방식으로

jaimemin.tistory.com

 

 

② 인덱스를 이용해서 0인 구역과 1인 구역을 나누어서 따로 count를 세고 마지막에 최소값을 구하는 방법이 있다. 처음에는 이 방법 자체가 이해가 안돼서 위에 방법으로 시도해보려고 했으나 실패했다. 사실 아직도 잘 모르겠다..★

 

참고한 사이트

mjeong9316.tistory.com/167

 

[C 언어] 백준 1018. 체스판 다시 칠하기

1018. 체스판 다시 칠하기 (누르면 해당 문제로 이동) N번째 종말의 수가 나올 때까지 차례대로 시도하는 문제 제약사항) 시간 : 2 초 메모리 : 128 MB 문제) 지민이는 자신의 저택에서 MN개의 단위 정

mjeong9316.tistory.com

hydroponicglass.tistory.com/31

 

백준 1018 체스판 다시 칠하기

문제 : https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의.

hydroponicglass.tistory.com

 

 

 2차원 배열 초기화 

blog.naver.com/1stwook/30182859109

 

2차원 배열과 포인터배열(2차원 문자배열)

이번에는 여러 개의 문자열을 처리하기 위한 2차원의 문자배열을 살펴볼거에요.하나의 문자열을 저장하기 ...

blog.naver.com

 

 

 

 문제 출처 

www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net