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

준블리·2021년 12월 2일
0

백준

목록 보기
6/8

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

1. 문제 이해

처음에는 문제에 대해서 가볍에 생각했다. (이 점이 항상 나의 가장 큰 잘못된 부분이고 고쳐야 된다고 다시 다짐했다.)

Black 또는 White 로 칠해진 맵이 주어지고, 여기서 8x8이란 마스크를 돌렸을 때 최소로 정상적인 체스판이 되도록 색칠하게 되는 경우의 수를 구하는 문제다.

2. 소스 코드

#include<vector>
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
vector<string> board;
int min_point;
void check(int x, int y) {
	int point = 0;
	for (int i = x; i < x + 8; i++) {
		for (int j = y; j < y + 8; j++) {
			int po = i + j;
			if (po % 2 == (x + y) % 2 && board[i][j] != board[x][y])point++;
			if (po % 2 != (x + y) % 2 && board[i][j] == board[x][y])point++;
		}
	}
	if (point < min_point)min_point = point;

	point = 1;
	if (board[x][y] == 'B')board[x][y] = 'W';
	else board[x][y] = 'B';
	for (int i = x; i < x + 8; i++) {
		for (int j = y; j < y + 8; j++) {
			int po = i + j;
			if (po % 2 == (x + y) % 2 && board[i][j] != board[x][y])point++;
			if (po % 2 != (x + y) % 2 && board[i][j] == board[x][y])point++;
		}
	}
	if (point < min_point)min_point = point;
}


int main() {
	int n, m;
	cin >> n >> m;
	min_point = 1;
	min_point = min_point << 31;
	min_point = ~min_point;
	for (int i = 0; i < n; i++) {
		string sample;
		cin >> sample;
		board.push_back(sample);
	}
	for (int i = 0; i < n; i++) {
		if (i + 7 >= n)continue;
		for (int j = 0; j < m; j++) {
			if (j + 7 >= m)continue;
			check(i, j);
		}
	}
	cout << min_point << endl;
}

3. 생각한 풀이 방식

(0,0) 이란 좌측상단 좌표를 8x8 정사각형에 기점으로 for문을 돌리는데, 이때 가로 또는 세로로 8보다 초과하는 만큼만 왼쪽 위를 움직여 주면 된다.
예를 들어 주어진 크기가 9x9 라면 좌측상단 좌표는 (0,0) (0,1) (1,0) (1,1) 인 경우를 완전 탐색 해주는 문제였다.

4. 얻어가는 Tip

이 문제,, 사실 제출을 많이했다.
그 이유는 문제를 성심성의껏 읽지 못했고 100%이해하지 못했다.
처음에는 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다. 라는 지문을 읽고, 좌측 상단은 고정된 값이라고 이해를 했다,
그래서 좌측 상단을 블랙->화이트 / 화이트-> 블랙 으로 바꾸는 case 는 생각하지 않고 계산을 했다..
물론 test case 중에 이를 반증해주는 case가 있어서 몇 번 디버깅을 해서 알아냈지만,

여러번 코테를 해봤던 경험으로,, 보통 이렇게 무난하게 나만의 환경에서 디버깅을 할 수 있는 조건은 많지 않았었다.

그러니까 이 문제를 결국 통과했을때 느낀 핵심은

문제 똑! 바로 읽자.

profile
★ 작심삼일을 삼일에 한번씩 ★ 주로 C++ 입니다~

0개의 댓글