페이지

1018번: 체스판 다시 칠하기

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


$O(nm)$


#include<cstdio>
#include<algorithm>
using namespace std;
int n, m, r = 1e9;
char s[50][51];
int main() {
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i++) scanf("%s", s + i);
        for (int i = 0; i + 7 < n; i++) {
                for (int j = 0; j + 7 < m; j++) {
                        int c = 0;
                        for (int k = i; k < i + 8; k++)
                            for (int l = j; l < j + 8; l++)
                                c += s[k][l] == 'B' ^ k + l & 1;
                        r = min({ r,c,64 - c });
                }
        }
        printf("%d", r);
        return 0;
}

댓글 2개 :

  1. 안녕하세요 운영자님 덕분에 감사하게도 코드 공부를 하고 있는 학생입니다.
    궁금한 점이 있는데 for문 맨 마지막에 c += s[k][l] == 'B' ^ k + l & 1; 를 어떻게 해석할 수 있을까요?
    우선순위가 헷갈려서요;; 답변해주시면 감사하겠습니다! ㅎㅎ

    답글삭제
    답글
    1. 연산자가 +, ==, &, ^ 순으로 연산합니다.
      따라서 주어진 식은 (s[k][l]=='B')^((k+l)&1)와 같습니다.
      x&1은 홀수이면 1 짝수이면 0 이고
      (k+l)&1을 하면 [k][l] 배열이 체스판처럼 1,0 이 번갈아 나오도록 만들 수 있습니다.
      다른 수를 ^하면 1 이 되므로
      체스판에서 0, s[k][l]=='B'
      체스판에서 1, s[k][l]=='W'
      일 때 카운트 됩니다.

      삭제