문제 >> 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<m && 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)
'Algorithm Problem Solving' 카테고리의 다른 글
5432. 쇠막대기 자르기 (0) | 2019.01.15 |
---|---|
1218. [S/W 문제해결 기본] 4일차 - 괄호 짝짓기 (0) | 2019.01.15 |
1206. [S/W 문제해결 기본] 1일차 - View (0) | 2019.01.11 |
1225. [S/W 문제해결 기본] 7일차 - 암호생성기 (0) | 2019.01.11 |
[BOJ] 15686 : 치킨배달 (1) | 2019.01.08 |