728x90
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.StringTokenizer;
public class Main_BJ_1018_체스판다시칠하기 {
static int n, m, ans;
static char[][] map;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new char[n][m];
for(int i=0; i<n; i++){
String str = br.readLine();
for(int j=0; j<m; j++){
map[i][j] = str.charAt(j);
}
}
ans = Integer.MAX_VALUE;
for(int i=0; i<n-7; i++){
for(int j=0; j<m-7; j++){
find(i, j);
}
}
System.out.println(ans);
}//main
private static void find(int x, int y){
int cnt = 0;
char cur = map[x][y];
for(int i=x; i<x+8; i++){
for(int j=y; j<y+8; j++){
if(cur != map[i][j])
cnt++;
if(cur == 'B')
cur='W';
else cur='B';
}
if(cur == 'B')
cur='W';
else cur='B';
}
cnt = Math.min(cnt, 64-cnt);
ans = Math.min(cnt, ans);
}//find
}
이 문제는 완탐의 기본적인 문제라고 할 수 있다.
8칸씩 확인해야하므로 n-7, m-7위치까지 순회하고,
find 함수에서 순회하면서 바꿔야 하는 칸을 센다.
이때, 기준점을 왼쪽 최상단으로 잡는데, 그대로 잡을 것인지 아님 반대로 잡을 것인지 정해야 한다.
나는 그대로 잡는 것으로 두고 했다!
그리고, 반대를 기준으로 잡을 때는 64칸 중 셌던 칸을 빼면 되므로 간단하게 구할 수 있다.
이 부분이 헷갈렸는데, 생각해보면 당연한거더라....
728x90
'코테 > 백준' 카테고리의 다른 글
백준 14888 연산자 끼워넣기(JAVA) (0) | 2023.05.05 |
---|---|
백준 2156 포도주 시식(JAVA) (4) | 2023.05.03 |
백준 13913 숨바꼭질 4(JAVA) (0) | 2023.04.28 |
백준 12851 숨바꼭질2(JAVA) (0) | 2023.04.25 |
백준 10807 개수 세기(JAVA) (0) | 2023.04.23 |