Algorithm

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

1984 2022. 1. 22. 20:46
  • 2차원 벡터
  • 체스판 돌려가면서 체크했다. (간단하게 하는 방법이 있을 것 같기도 하다.)
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(void)
{
	int M, N;

	// 몇 칸 짜리 보드인지
	cin >> M >> N;

	//2차원 벡터 생성 후 -> 보드 상태 넣어준다.
	vector <vector<char>> origin_board;

	for (int i = 0; i < M; i++)
	{
		char c;
		vector <char> line;
		for (int j = 0; j < N; j++)
		{
			cin >> c;
			line.push_back(c);
		}
		origin_board.push_back(line);
	}

	// 색을 바꿔야 하는 횟수
	int count;
	// 바꿔야 하는 숫자 최솟값
	int min_count = 2500;

	// 시작 위치 설정
	char first_space;
	char second_space;

	for (int o_i = 0; o_i < M; o_i++)
	{
		// 자를 사이즈가 나오는지 확인하기
		if (o_i + 8 > M) break;
		for (int o_j = 0; o_j < N; o_j++)
		{
			// 자를 사이즈가 나오는지 확인하기
			if (o_j + 8 > N) break;
			// 기준 공간에서 시작해서 8X8 확인한다. count 초기화
			// 체스판을 돌려가면서 확인한다.
			count = 0;
			for (int i = 0; i < 8; i++)
			{
				for (int j = 0; j < 8; j++)
				{
					second_space = origin_board[o_i + i][o_j + j];
					if (i == 0 && j == 0)
					{
						// 기준 공간
						first_space = second_space;
					}
					else
					{
						//기준 공간이랑 비교해서 다르면 count up 해야함.
						if (first_space != second_space) count++;
					}

					//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
					if (j == 7) continue;
					if (first_space == 'B') first_space = 'W';
					else if (first_space == 'W') first_space = 'B';

				}
			}
			if (count < min_count) min_count = count;

			count = 0;
			for (int j = 7; j >= 0; j--)
			{
				for (int i = 0; i < 8; i++)
				{
					second_space = origin_board[o_i + i][o_j + j];
					if (i == 0 && j == 7)
					{
						// 기준 공간
						first_space = second_space;
					}
					else
					{
						//기준 공간이랑 비교해서 다르면 count up 해야함.
						if (first_space != second_space) count++;
					}

					//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
					if (i == 7) continue;
					if (first_space == 'B') first_space = 'W';
					else if (first_space == 'W') first_space = 'B';

				}
			}
			if (count < min_count) min_count = count;

			count = 0;
			for (int j = 0; j < 8; j++)
			{
				for (int i = 7; i >= 0; i--)
				{
					second_space = origin_board[o_i + i][o_j + j];
					if (i == 7 && j == 0)
					{
						// 기준 공간
						first_space = second_space;
					}
					else
					{
						//기준 공간이랑 비교해서 다르면 count up 해야함.
						if (first_space != second_space) count++;
					}

					//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
					if (i ==0) continue;
					if (first_space == 'B') first_space = 'W';
					else if (first_space == 'W') first_space = 'B';

				}
			}
			if (count < min_count) min_count = count;

			count = 0;
			for (int i = 7; i >= 0; i--)
			{
				for (int j = 7; j >= 0; j--)
				{
					second_space = origin_board[o_i + i][o_j + j];
					if (i == 7 && j == 7)
					{
						// 기준 공간
						first_space = second_space;
					}
					else
					{
						//기준 공간이랑 비교해서 다르면 count up 해야함.
						if (first_space != second_space) count++;
					}

					//기준 공간 설정 (다음 줄로 넘어갈 때 예외입니다.)
					if (j == 0) continue;
					if (first_space == 'B') first_space = 'W';
					else if (first_space == 'W') first_space = 'B';

				}
			}
			if (count < min_count) min_count = count;
		}
	}

	cout << min_count;
	return 0;
}

 

[참고 자료]

728x90