공부/백준(C++) - 2022~

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

상연 2022. 1. 25. 20:22

목차

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 case1[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 case2[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 main() {
	int n, m, answer = 99999999;
	cin >> n >> m;
	
	char board[n][m];
	for(int i=0; i<n; i++)
	{
		string line;
		cin >> line;
		
		for(int j=0; j<m; j++)
		{
			board[i][j] = line[j];
		}
	}
	
	for(int i=0; i<n-7; i++)
	{
		for(int j=0; j<m-7; j++)
		{
			int diff1 = 0;
			int diff2 = 0;
			for(int x=0; x<8; x++)
			{
				for(int y = 0; y < 8; y++)
				{
					if(board[i+x][j+y] != case1[x][y]) diff1++;
					if(board[i+x][j+y] != case2[x][y]) diff2++;
				}
			}
			int small_diff = diff1 < diff2 ? diff1 : diff2;
			answer = small_diff < answer ? small_diff : answer;
		}
	}
	
	cout << answer;
	
	
	return 0;
}

 

설명

예전에 맨 처음 이 문제를 접했을때는 진짜 3시간을 고민하고도 못 풀어서 굉장히 좌절했었던 기억이 있다.

이번에는 비교적 꽤 쉽게 풀 수 있었는데

그냥 주어진 판에서 8X8 로 자를 수 있는 모든 부분을 정상적인 체스판와 대입해서 얼마나 차이가 있는지 확인하면 된다. 그 차이가 가장 적은 수를 출력.

'공부 > 백준(C++) - 2022~' 카테고리의 다른 글

백준 2750번: 수 정렬하기[C++]  (0) 2022.01.26
백준 1436번: 영화감독 숌 [C++]  (0) 2022.01.25
백준 7568번: 덩치 [C++]  (0) 2022.01.25
백준 2231번: 분해합 [C++]  (0) 2022.01.25
백준 2798번: 블랙잭 [C++]  (0) 2022.01.25