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



문제를 해결하기 위해 접근한 방법은 다음과 같다.


1. 왼쪽 상단이 W로 시작할 때, W와 B가 와야할 자리에 다른 문자가 오면 1로 표시를 한다.

2. 8*8만큼의 체스판에서 W로 시작할 때 바꿔야할 문자의 개수를 구한다.

3. 8*8만큼의 체스판에서 B로 시작할 때 바꿔야할 문자의 개수를 구한 뒤에 (64에서 W로 시작할 때 바꿔야할 문자 개수를 빼주면 된다)

   W로 시작할 때 바꿔야할 문자 개수와의 비교 후, 최소값을 구한다.

4.왼쪽 상단의 좌표를 변경하면서 바꿔야할 문자 개수의 최소값을 업데이트 해준다.



vec라는 2차원 배열을 만든 후에 W로 시작할 때 바꿔야할 문자를 1로 세팅을 해주면

0이 있는 좌표들은 B로 시작할 때 바꿔야할 문자의 자리라는 것을 의미한다.


그렇기 때문에 W로 시작할때 바꿔야할 문자의 개수를 구한다면 B로 시작할 때 바꿔야할 문자의 개수도 바로 알 수 있다.



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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
 
int N,M;
vector<vector<char>> map;
vector<vector<int>> vec;
 
int main(){
    
    cin>>N>>M;
    map=vector<vector<char>> (N,vector<char>(M,0));
    vec=vector<vector<int>> (N,vector<int>(M,0));
    
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            cin>>map[i][j];
 
            //'W'로 시작할 때 각 자리에 W,B가 오지 않는 경우
            if((i+j)%2==0 && map[i][j]!='W')    vec[i][j]++;
            if((i+j)%2==1 && map[i][j]!='B')    vec[i][j]++;
        }
    }
 
    int ans=N*M;
    for(int i=0;i+7<N;i++){
        for(int j=0;j+7<M;j++){
            
            int cnt=0;
            for(int y=0;y<8;y++){
                for(int x=0;x<8;x++){
                    cnt+=vec[i+y][j+x];
                }
            }
            
            //'W'로 시작할 때 바꿔야할 문자 개수(cnt)와 'B'로 시할 때 바꿔야할 문자 개수(64-cnt)
            cnt=min(cnt,64-cnt); 
            ans=min(ans,cnt);
        }
    }
    cout<<ans<<endl;
    return 0;
}
cs


'알고리즘(BOJ) > 시뮬레이션' 카테고리의 다른 글

백준 16235번 - 나무 재테크  (0) 2019.05.10
백준 1713번 - 후보 추천하기  (0) 2019.05.05
백준 2798번 - 블랙잭  (0) 2019.04.28
백준 17135번 - 캐슬 디펜스  (0) 2019.04.20
백준 1547번 - 공  (0) 2019.03.26

+ Recent posts