[백준/C++] 1018번 체스판 다시 칠하기

최대 1 분 소요

1.문제 링크

체스판 다시 칠하기



2. 풀이 전 계획과 생각

  • 완전탐색



3. 풀이

#include<iostream>
#define INF 99999999
using namespace std;

char map[50][50];

char ex1[8][8]={ // 첫번째 경우  
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'}
};
char ex2[8][8]={ // 두번째 경우  
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'},
	{'B','W','B','W','B','W','B','W'},
	{'W','B','W','B','W','B','W','B'}
};

int main(){
	int n,m; cin>>n>>m;
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>map[i][j];
		}
	}
	
	
	int ans=INF;
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(i+8<=n && j+8<=m){
				int ex1Cnt=0, ex2Cnt=0;
				for(int m=i;m<i+8;m++){
					for(int n=j;n<j+8;n++){
						if(map[m][n]!=ex1[m-i][n-j]) ex1Cnt++; // 다른 경우  
						if(map[m][n]!=ex2[m-i][n-j]) ex2Cnt++; // 다른 경우  
					}
				}
				int temp = min(ex1Cnt, ex2Cnt);
				if(temp<ans) ans = temp; // 최소값 갱신  
				
			}
		}
	}
	
	cout<<ans; // 답 출력  
}

체스판은 2가지 경우 밖에 없다. 경우의수 두가지에 대해서 모두 완전탐색해 최솟값을 찾는다.



4. 풀이하면서 고민했던 점



5. 문제를 풀고 알게된 개념 및 소감