PS/Baekjoon Online Judge

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

kimyoungrok 2021. 7. 15. 01:53

백준 - 1018


풀이

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);
}

출처

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

'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