
백준 1018-체스판 다시 칠하기(브루트 포스)
이중 반복문 사용하여 이차원 배열에서 부분 이차원 배열 추출
static char[][] extract(char[][] map, int rs, int cs){
int n = map.length;
char[][] ret = new char[n][n];
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
ret[i][j] = map[rs + i][cs + j];
}
}
return ret;
}
8x8 크기의 부분 체스판을 추출하고, 그 체스판에서 색깔을 바꾸는 작업을 처음에는 다음과 같은 코드로 수행했습니다.
static void copy(char[][] src, char[][] dest){
int n = src.length, m = src[0].length;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
dest[i][j] = src[i][j];
}
}
}
static int count(char[][] a){
int cnt = 0;
char[][] arr = new char[8][8];
copy(a, arr);
for(int i = 0; i < 7; i++){
for(int j = 0; j < 7; j++){
if(arr[i][j] == 'W'){
if(arr[i+1][j] == 'W'){
arr[i+1][j] = 'B';
cnt++;
}
if(arr[i][j+1] == 'W'){
arr[i][j+1] = 'B';
cnt++;
}
}
else{
if(arr[i+1][j] == 'B'){
arr[i+1][j] = 'W';
cnt++;
}
if(arr[i][j+1] == 'B'){
arr[i][j+1] = 'W';
cnt++;
}
}
}
}
copy(a, arr);
return cnt;
}
임시 배열을 만들고, 실제로 배열의 색깔을 바꿔가면서 카운트를 했습니다. 그러나 이 코드는 예제 4번에서 오답을 냈습니다. 2차원 배열의 맨 마지막 원소가 연산에서 제외되기 때문이었습니다.
그냥 체스판을 하드코딩해서 해결했습니다.
static char[][] board1 = {
{'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'}
};
static char[][] board2 = {
{'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'}
};
static int count(char[][] a){
int c1 = 0, c2 = 0;
for(int i = 0; i < 8; i++){
for(int j = 0; j < 8; j++){
if(a[i][j] != board1[i][j])c1++;
if(a[i][j] != board2[i][j])c2++;
}
}
return Math.min(c1, c2);
}
W로 시작하는 체스판과 B로 시작하는 체스판을 하드코딩하고, 각각을 부분배열과 비교해서 더 작은 값을 리턴했습니다.
역시 패턴을 비교하는 문제에서는 하드코딩으로 무식하게 푸는 것이 좋습니다(대표적으로 테트로미노 문제).
내일 출제될 문제를 풀고, 그리디 문제를 풀 예정입니다.