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

2023. 7. 24. 10:14코딩테스트/백준

[문제]

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

[풀이]

<내 잘못>

*문제를 제대로 안 읽는 바람에 생각보다 문제를 푸는데 오래 걸렸고, 코드를 한 번 뒤집어 엎었다.

*n이 x축의 값이라고 헷갈리는 바람에 시간이 더 오래 걸렸다.

<코드설명>

코드의 구조를 설명하자면

0. min = 가장 작은 값, sum

1. a에 동적할당을 통해 문자를 집어넣었고

2. while문을 통해 아래와 같은 순서로 8*8개씩 검사하여 가장 작은 것을 고를 수 있도록 설정함

[코드]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int n, m, i = 8, j = 7, min = 100;
	int** a;
	char s[50];
	scanf("%d %d", &n, &m);
	a = (int**)malloc(sizeof(int*) * n);
	for (int i = 0; i < n; i++) //2차원 동적할당
		a[i] = (int*)malloc(sizeof(int) * m);
	for (int i = 0; i < n; i++) {
		scanf("%s", s);
		for (int j = 0; j < m; j++) {
			a[i][j] = s[j];
		}
	}


	while (i>=0)
	{
		int sum = 0; //W먼저 바둑알을 놓는 경우
		j++;
		for (int x = i - 8; x < i; x++) {
			for (int y = j - 8; y < j; y++)
			{
				if (x % 2 == 0 && y % 2 == 0) {
					if (a[x][y] != 'W')
						sum++;
				}
				else if (x % 2 == 0 && y % 2 != 0) {
					if (a[x][y] != 'B')
						sum++;
				}
				else if (x % 2 != 0 && y % 2 == 0) {
					if (a[x][y] != 'B')
						sum++;
				}
				else if (x % 2 != 0 && y % 2 != 0) {
					if (a[x][y] != 'W')
						sum++;
				}
			}
		}
		if (sum < min) //이때의 최솟값이 min보다 작다면
			min = sum;

		sum = 0; //B먼저 바둑알을 놓는 경우
		for (int x = i - 8; x < i; x++) {
			for (int y = j - 8; y < j; y++)
			{
				if (x % 2 == 0 && y % 2 == 0) { //B가 있어야 할 자리에
					if (a[x][y] != 'B') //B가 없다면
						sum++; //sum을 1 더하라
				}
				else if (x % 2 == 0 && y % 2 != 0) {
					if (a[x][y] != 'W')
						sum++;
				}
				else if (x % 2 != 0 && y % 2 == 0) {
					if (a[x][y] != 'W')
						sum++;
				}
				else if (x % 2 != 0 && y % 2 != 0) {
					if (a[x][y] != 'B')
						sum++;
				}
			}
		}
		if (sum < min) //이때의 최솟값이 min보다 작다면
			min = sum;

		if (i == n && j == m) //i와 j가 마지막이면 반복문을 빠져나가라
			break;
		

		if (j == m) { //j가 m까지 갔다면
			j = 7; //밑의 줄을 다시 처음부터 계산하자
			i++;
		}
	}


	printf("%d", min);

	for (int i = 0; i < n; i++)
		free(a[i]);
	free(a);
	return 0;
}