문제 >> 1018. 체스판 다시 칠하기




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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
 
int m,n;
char map[51][51]={0,};
char mmap[51][51]={0,};
 
int dy[2]={-1,0};
int dx[2]={0,-1};//위, 왼쪽
 
void map_copy(){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            mmap[i][j] = map[i][j];
        }
    }
}
 
int make_chess(int start_y, int end_y, int start_x, int end_x){
    int change=0;
    map_copy();
    
    for(int i=start_y; i<=end_y;i++){
        for(int j=start_x; j<=end_x; j++){
           // now = mmap[i][j];
            
            for(int k=0;k<2;k++){
                int ny = i+dy[k];
                int nx = j+dx[k];
                
                if(ny<start_y || nx <start_x || ny>end_y || nx>end_x) continue;
                
                if(mmap[i][j] == mmap[ny][nx]){
                    mmap[i][j] = (mmap[i][j]=='W')? 'B':'W';
                    change++;
                }
                
            }
            
            
        }
    }
    
    return change;
}
 
 
 
int main(int argc, const char * argv[]) {
    
    scanf("%d %d"&m,&n);
    
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            scanf(" %c",&map[i][j]);
            //if(c=='\n')
        }
    }
    
    int min = 987654321;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            int end_y = i+7;
            int end_x = j+7;
            if(end_y<&& end_x<n){
                int ret = make_chess(i,end_y,j,end_x);
                ret = ret > (64-ret)? 64-ret : ret;
                min = min > ret? ret : min;
            }
        }
    }
    
    printf("%d\n", min);
    
    return 0;
}
 
cs



1. 공백 없는 문자 입력받기

   scanf(" %c", &map[i][j]);

   % 앞에 띄어쓰기 해주기.


2. 입력으로 주어지는 문자들을 배열에 담고

   8x8 크기로 배열을 순회했다. (64번 코드)

   (i+7) 과 (j+7)이 map 범위 안 일 때만 실행.


3. 8x8 체스판의 시작점과 끝점을 parameter로 하는 함수를 만들어 체스판이 되기 위해 색 변경 횟수를 카운트했다.

   모든 index를 방문하면서, 본인 기준 왼쪽과 오른쪽 지점의 색을 확인해서 같다면 본인 색을 바꿔주는 식으로 카운트.


4. ** 헤맸던 부분

   8*8 체스판에서 

   0번 색을 변경 = 64번 변경  (변경할 색이 없다는 것은 모든 지점의 색을 반전해줘도 체스판이기 때문)

   1번 변경 = 63 번 변경 

   과 같다.


   따라서 함수를 통해 얻은 cnt 값과 64- cnt 값을 비교해 더 작은 값을 취하도록 한다. (66번 코드)


5. 최소값을 찾는다. (67)

+ Recent posts