Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(25682) 체스판 다시 칠하기 2 본문

백준 (C++)/Solve

(25682) 체스판 다시 칠하기 2

dh-winternagi 2026. 4. 18. 08:59

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

단계별로 풀어보기

22단계(누적 합) 6번째

 

 

 

체스판과 같은 크기의 벡터를 생성하고, 체스판을 임의의 제대로 색칠된 체스판과 비교하여 색이 맞으면 0, 틀리면 1로 둔다.

이제 구간 ((i-k,j-k),(i,j))의 합은 이 구간으로 잘랐을 때 다시 칠해야 하는 칸의 수와 같다. 구간합은 누적합 배열을 사용해 빠르게 구할 수 있다.

이때 우리가 임의로 설정한 체스판의 색반전 버전도 제대로 색칠된 체스판이므로, 전체 칸 수에서 계산한 값을 뺀 결과도 다시 칠해야 하는 칸의 수가 될 수 있다.

 

 

 

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  
  int n, m, k;
  
  cin >> n >> m >> k;
  
  vector s(n+1, vector<int> (m+1));
  
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      char c;
      
      cin >> c;
      
      s[i][j]= ((i+j)&1 ? c=='B' : c=='W');
      s[i][j]+= s[i-1][j]+s[i][j-1]-s[i-1][j-1];
    }
  }
  
  int ans= k*k;
  
  for(int i=k;i<=n;i++){
    for(int j=k;j<=m;j++){
      int t= s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k];
      
      ans= min(ans, t);
      ans= min(ans, k*k-t);
    }
  }
  
  cout << ans;
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(1931) 회의실 배정  (0) 2026.04.18
(11047) 동전 0  (0) 2026.04.18
(11660) 구간 합 구하기 5  (0) 2026.04.18
(10986) 나머지 합  (0) 2026.04.18
(16139) 인간-컴퓨터 상호작용  (0) 2026.04.18