[백] 1018 체스판 다시 칠하기 - 문자열 싫어하기

serotonins·2022년 9월 17일
0

Coding Q

목록 보기
11/17
  1. char형은 프린트는 %d로 해도 되긴 하는데 스캔하려면 %hhd로 해야한다.

  2. %c 입력받을 때는 %d과는 달리 정수형이 아니라 문자를 받기 때문에 앞의 \n도 받아버린다. 따라서 원하는 입력과 다른 입력을 하게 될 가능성이 높기 때문에 앞의 개행문자나 공백을 무시하기 위해 scanf(" %c", &a);로 입력을 받아준다.

이와 관련해서 덧붙이고 싶은 내용이 있다.
scanf("%[^문자]s", &str); 과 같이 표현해주면 해당 문자를 받을 때까지 문자열을 계속 입력 받을 수 있다. 공백 포함하여 받을 수 있는 것!
개행 문자 받기 전까지 입력 받으려면 scanf("%[^\n]s", str);

행과 열을 더했을 때 짝수인 경우, 홀수인 경우 다른 색이면 올바른 상태. 012 123 234 //3칸씩이면 이런 식으로 체스판이 전개되니까.

8x8의 체스판 틀을 옮겨가며 검사했다.
흰색으로 시작하든 검은색으로 시작하든 변을 공유하는 칸이 다른 색이기만 하면 되니까 가장 적은 경우의 수를 찾기 위해 흰색인 경우, 검은색인 경우를 둘 다 구하고 비교해서 적은 경우만 남긴다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <malloc.h>

char count = 64, count_B = 0, count_W = 0;
char n = 0, m = 0;
char chess[50][50] = { 0, };
int i = 0, j = 0, k = 0, l = 0;

int main()
{
	scanf("%hhd %hhd", &m, &n); //행 열
	
	for (int i = 0; i < m; i++) //행
		for (int j = 0; j < n; j++) //열
			scanf(" %c", &chess[i][j]);

	for (i = 0; i <= m - 8; i++) //행
		for (j = 0; j <= n - 8; j++) //열
		{
			count_B = 0; count_W = 0;

			for (k = i; k < i + 8; k++)
				for (l = j; l < j + 8; l++) {
					if (!((k + l) % 2) && (chess[k][l] == 'B')) count_W++;
					else if (((k + l) % 2) && (chess[k][l] == 'W')) count_W++;
					if (!((k + l) % 2) && (chess[k][l] == 'W')) count_B++;
					else if (((k + l) % 2) && (chess[k][l] == 'B')) count_B++;
				}

			if (count_B > count_W) count_B = count_W;
			if (count > count_B) count = count_B;
		}


	printf("%d\n", count);

	for (int i = 0; i < 3; i++) getchar();
	return 0;
}

0개의 댓글