728x90
문제
NxM크기의 체스보드가 있다. 체스보드는 검은색과 흰색이 번갈아가면서 칠해져 있어야한다. 8X8크기로 체스보드를 잘랐을 때 다시 칠해야 하는 칸이 최소일 때의 개수를 구하라.
입력
첫째 줄에 N과 M이 주어지며 N과 M은 8이상 50이하이다.
둘재 줄부터 체스판의 정보가 입력되며 W는 흰색, B는 검정색이다.
출력
다시 칠해야 하는 칸의 최솟값을 출력한다.
8x8 크기의 체스판이 제대로 칠해져 있는 경우는 두 가지이다. 검, 흰이 번갈아가면서 칠해질 때 (0, 0)의 칸이 검정색 또는 흰색으로 시작하는 경우이다.
따라서 입력받은 체스판을 8x8크기로 잘라서 두 개의 알맞는 체스판과 비교를 한다.
체스판을 어떻게 자를지 생각을 많이했다. 결론적으로 시작점의 위치만 알면 비교가 가능하다는 것을 알게되었으며 solution 함수에 시작점의 위치를 넘겨서 체스판을 비교하였다. 이때 0~8까지 비교를 할 때 원본 체스판의 좌표는 파라미터로 받은 값과 현재 인덱스를 더해서 비교하였다. 이렇게 해야 정확한 위치로 비교할 수 있다.
이렇게 두 개의 경우에 대해 비교하여 다른 값이라면 카운트를 해서 최솟값을 위한 비교를 진행하도록 한다.
#include "pch.h"
#include <iostream>
#include<algorithm>
#include <vector>
using namespace std;
char WB[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 BW[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 N, M;
char chessMap[50][50];
int answer = 1000000000;
void solution(int y, int x) {
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
// 원본을 8x8크기로 자른 것으로 표현하기 위해
// 비교맵을 기준으로 파라미터로 입력된 값을 각각의 인덱스에 더해준다.
if (WB[i][j] != chessMap[i + y][j + x])
cnt1++;
}
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (BW[i][j] != chessMap[i + y][j + x])
cnt2++;
}
}
answer = min(answer, min(cnt1, cnt2));
return;
}
int main()
{
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> chessMap[i][j];
}
}
for (int i = 0; i <= N-8; i++) {
for (int j = 0; j <= M-8; j++) {
solution(i, j);
}
}
cout << answer << endl;
return 0;
}
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 11047] 동전 0 (0) | 2021.02.04 |
---|---|
[백준 11399] ATM cpp (0) | 2021.02.03 |
[백준 1182] 부분수열의 합 cpp (0) | 2021.02.02 |
[백준 14889] 스타트와 링크 cpp (0) | 2021.02.02 |
[백준 14888] 연산자 끼워넣기 cpp (0) | 2021.02.01 |