세상에 나쁜 코드는 없다

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

Computer Science/Problem Solving

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

Beomseok Seo 2021. 3. 1. 18:39

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

 

#include <iostream>
using namespace std;
char board[50][50];
int row, col;

void init()
{
	cin >> row >> col;
	for(int i=0; i<row; i++)
	{
		for(int j=0; j<col; j++)
		{
			cin >> board[i][j];
		}
	}
}

// board[r][c]에서 시작하는 8*8 체스판에서 칠해야하는 가장 적은 값 반환
int getMinAtBoard(int r, int c)
{
	int count=0;
	for(int i=r; i<r+8; i++)
	{
		for(int j=c; j<c+8; j++)
		{
			if((i+j) % 2 ==0 && board[i][j]=='W')
				count++;
			if((i+j) % 2 ==1 && board[i][j]=='B')
				count++;
		}
	}
	if(count > 32)
		count = 64 - count;
	
	return count;
}

int main() {

	init();
	int min=32, temp_min;
	
	for(int i=0; i< row-7; i++)
	{
		for(int j=0; j<col-7; j++)
		{
			temp_min = getMinAtBoard(i,j);
			if(min > temp_min)
				min = temp_min;
		}
	}

	cout << min;
	return 0;
}

 

1. getMinAtBoard 함수에서, i+j 를 2로 나눈 나머지에 따라 같은 색이 칠해져야 한다는 점을 반영하여 count를 늘려주었고,

왼쪽 상단이 흰색이냐 검은색이냐에 따라 달라지는 값은 n과 64-n의 관계이므로 둘 중 작은 값을 반환하게 만들었다.

(코드상에서 count는 왼쪽 상단이 B인 경우를 기준으로 다시 색을 칠해야 할때마다 1씩 올려주는 방식으로 만들었음)

'Computer Science > Problem Solving' 카테고리의 다른 글

[백준] 2630번: 색종이 만들기  (0) 2021.03.10
[백준] 15661번: 링크와 스타트  (0) 2021.03.01
[백준] 7568번: 덩치  (0) 2021.03.01
[백준] 4096번: 팰린드로미터  (0) 2021.03.01
[백준] 2615번 오목  (0) 2021.01.31