풀이
N * M 크기의 보드를 2차원 배열로 입력받고, (0, 0), (0, 1), (0, 2), ... 각 요소들을 기준으로 8 * 8크기의 보드를 수정해 체스판을 만들 때, 몇 개의 칸이 수정되어야 생성되는지 최소값을 기록하는 방식으로 해결할 수 있다.
맨 처음 시작좌표인 (0, 0)을 기준으로 다음과 같은 체스판을 생성하기 시작한다고 가정한다. (빨간 사각형)
- 기준이 되는 시작 좌표는 (row, col)이며, 이 값을 가상의 보드를 생성하는 함수로 복사한다.
- 시작 좌표를 기준으로 (row ~ +7, col ~ +7)의 범위 (빨간 사각형) 안에서, 체스판을 생성할 때 최소 몇개의 칸이 수정되는지 확인
- 검정칸 이어야 하는 곳((i + j) % 2 == 0)이 검정칸이면, white++, 아니면 black++
- 흰색칸 이어야 하는 곳((i + j) % 2 != 0)이 검정칸이면, black++, 아니면 white++
- 기존의 최솟값인 min과 흰/검정색 별로 새로 칠해야 되는 곳의 수를 기록한 white, black를 비교해, 최솟값을 알아내고 반환한다. (주어진 입력에 따라 흰색으로 칠하는 것과 검정색으로 칠하는 경우 중 최소값을 구하기 위함)
소스코드
#include <stdio.h>
#define MIN(a, b) (a < b ? a : b)
char board[50][50];
int board_check(int row, int col, int min){
int white = 0, black = 0;
for (int i = row; i < row + 8; i++)
for (int j = col; j < col + 8; j++)
if (!((i+j) % 2) )
board[i][j] == 'B' ? white++ : black++;
else board[i][j] == 'B' ? black++ : white++;
return MIN(min, MIN(white, black));
}
int main(){
int N, M, min = 64;
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++)
scanf("%s", &board[i]);
for (int row = 0; row < N - 7; row++)
for (int col = 0; col < M - 7; col++)
min = board_check(row, col, min);
printf("%d", min);
}
출처
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 1181] 단어 정렬 [C] (0) | 2021.07.15 |
---|---|
[백준 1259] 팰린드롬수 [C] (0) | 2021.07.15 |
[백준 10998] A×B [C] (0) | 2021.07.15 |
[백준 11720] 숫자의 합 [C] (0) | 2021.07.15 |
[백준 11654] 아스키 코드 [C] (0) | 2021.07.14 |