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

alsry._.112·2023년 9월 1일
0

백준

목록 보기
41/102

🔗문제 풀러가기
단계별로 풀어보기 단계 12의 4번째 문제이다.

문제 분석


B로 시작하는 체스판과 W로 시작하는 체스판 2개를 배열로 미리 선언한 뒤 브루트포스 알고리즘을 이용하여 비교하는 방식으로 문제를 해결하였다.

코드

#include <iostream>
 using namespace std;

 char arr[51][51];
 char whiteArr[8][8] =
 {
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W'
 };

 char black_Arr[8][8] =
 {
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B',
	 'B','W','B','W','B','W','B','W',
	 'W','B','W','B','W','B','W','B'
 };

 int White(int x, int y)
 {
	 int cnt = 0;
	 for (int i = 0; i < 8; i++)
	 {
		 for (int j = 0; j < 8; j++)
		 {
			 if (arr[x + i][y + j] != whiteArr[i][j])
				 cnt++;
		 }
	 }
	 return cnt;
 }

 int Black(int x, int y)
 {
	 int cnt = 0;
	 for (int i = 0; i < 8; i++)
	 {
		 for (int j = 0; j < 8; j++)
		 {
			 if (arr[x + i][y + j] != black_Arr[i][j])
				 cnt++;
		 }
	 }
	 return cnt;
 }

 int main()
 {
	 int n, m;
	 int cnt = 51;

	 cin >> n >> m;

	 for (int i = 0; i < n; i++)
	 {
		 for (int j = 0; j < m; j++)
		 {
			 cin >> arr[i][j];
		 }
	 }

	 int white, black;
	 for (int i = 0; i <= n - 8; i++)
	 {
		 for (int j = 0; j <= m - 8; j++)
		 {
			 int curCnt;
			 white = White(i, j);
			 black = Black(i, j);

			 curCnt = white < black ? white : black;

			 cnt = curCnt < cnt ? curCnt : cnt;
		 }
	 }
	 std::cout << cnt;
 }

해석

  1. 체스판을 입력받는다.
  2. 입력받은 체스판을 정상적인 체스판으로 하기 위해 다시 칠해야 하는 횟수를 반환하는 함수 White와 Black에 넣어 필요한 횟수를 얻는다.
  3. 둘 중 더 필요한 횟수가 curCnt에 저장한다.
  4. 만약 curCnt가 이전 cnt보다 작다면 cnt에 저장한다.
  5. 이렇게 얻은 cnt를 출력하면 끝!
  • 마지막 출력에 cout이 모호하다는 오류가 발생하여 std::를 붙여주었다.
profile
소통해요

0개의 댓글