본문 바로가기
C

[C]백준 11.브루트포스: 1018

by 열지희공 2022. 1. 20.

백준 1018

 

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	char a[100][100];
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j <= m; j++) {
			scanf("%c", &a[i][j]);
		}
	}
	char r[100][100];
	for (int i = 0; i < n; i++) {
		for (int j = 1; j <= m; j++) {
			r[i][j - 1] = a[i][j];
		}
	}
	
	int l = n - 8;
	int k = m - 8;
	int res1 = 0;
	int res2 = 0;
	int min = 64;
	for (int i = 0; i <= l; i++) {
		for (int j = 0; j <= k; j++) {
			res1 = 0;
			res2 = 0;
			int b[100][100] = { 0, };
			for (int x = i; x < i + 8; x++) {
				for (int y = j; y < j + 8; y++) {
					if ((x + y) % 2 == 0) {
						if (r[x][y] == 'B') {
							res1++;
							b[x][y] = 1;
						}
						else {
							res2++;
							b[x][y] = 2;
						}
					}
					else {
						if (r[x][y] == 'W') {
							res1++;
							b[x][y] = 1;
						}
						else {
							res2++;
							b[x][y] = 2;
						}
					}
				}
			}
			if (res1 >= res2) {
				if (min > res2) {
					min = res2;
				}
			}
			else {
				if (min > res1) {
					min = res1;
				}
			}	
		}

	}
	printf("%d", min);
	return 0;
}

 

체스판은 맨 왼쪽 위칸이 B인 경우, 맨 왼쪽 위칸이 W인 경우 2가지가 존재한다.

체스판의 각 행과 열을 i, j라고 했을 때 각 칸을 i+j로 채워보면 위 사진의 왼쪽 칸처럼 나온다.
각 칸들을 (i+j)%2로 채워보면 위 사진의 오른쪽 칸처럼 나온다.

그러므로 0위치에 B가, 1위치에 W가 들어간 체스판과 0위치에 W, 1위치에 B가 들어간 체스판이 존재할 수 있다.

0위치에 B가, 1위치에 W가 들어가 있을 때 그 체스판은 1체스판이라 하고, 각 칸을 1로 표시하며 그 칸들의 개수를 res1로 생각했다.
반대로 0위치에 W가, 1위치에 B가 들어가 있을 때 그 체스판을 2체스판이라 하고, 각 칸을 2로 표시하며 그 칸들의 개수를 res2로 생각했다.

주어진 보드 중 8*8만큼의 크기를 잘라서 생각했을 때
만약 1이 2보다 많다면 그 체스판은 1체스판이여야 하므로 2의 개수만큼 다시 색칠해야 한다.
만약 2가 1보다 많다면 그 체스판은 2체스판이여야 하므로 1의 개수만큼 다시 색칠해야 한다.

또 주어진 보드는 n*m크기 이므로 8*8만큼의 크기를 잘라 생각하는 것을 각 행은 0부터 n-8까지, 각 열은 0부터 m-8까지 반복해서 해야한다.
그래서 이중 반복문을 이용해 행은 0부터 n-8까지 열은 0부터 m-8까지 반복하도록 했고,
그 안에서 시작 행부터 8번, 시작 열부터 8번 반복하여 8*8만큼만 고려했다.

 

주어진 보드를 %c를 이용해 한 문자씩 입력받았더니 문자가 들어가 있는 열의 인덱스가 1부터 시작하길래 이를 바꿔주기 위해 배열과 이중 반복문을 한번씩 더 사용했다. 그런데 다른 사람들의 코드를 보니 한 행에 대해서 %s를 이용해 문자열로 입력받는 것 같다. 잘 기억해놔야겠다.

int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	
	char r[100][100];
	
	for (int i = 0; i < n; i++) {
		scanf("%s", &r[i]);
	}
    return 0;
}

그리고 다시 칠해야 할 칸의 개수인 min을 8*8체스판이니 최대 64일것이라 생각해 64로 초기화했는데 찾아보니 64가 아니였다. 다시 생각해보니 min의 최대값은 32인 것 같다. 

<참고 링크>

https://terry1213.github.io/backjoon/1018/

 

'C' 카테고리의 다른 글

[C]백준 12.정렬: 2750  (0) 2022.01.21
[C]백준 11.브루트포스: 1436  (0) 2022.01.20
[C]백준 11.브루트포스: 7568  (0) 2022.01.20
[C]백준 11.브루트포스: 2231  (0) 2022.01.20
[C]백준 11.브루트포스: 2798  (0) 2022.01.20