1. 문제링크
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
2. 접근방법
88 크기의 체스판으로 다시 칠하겠다고 한다.
즉! 88크기만큼의 BW, WB 체스판을 각각 구하고 더 작은 체스판과 대조한다면?
정답이 나올것이라고 생각했다.
만들어둔 BW, WB 체스판에다가 하나하나 대조하여 카운트를 세고 더 작은 체스판으로 넣어준다면 된다!
3. 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, ans;
static String[] BW = {
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB" };
static String[] WB = {
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW" };
static String[] 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 String[N];
for (int i = 0; i < N; i++) {
map[i] = br.readLine();
}
ans = Integer.MAX_VALUE;
for (int i = 0; i <= N - 8; i++) {
for (int j = 0; j <= M - 8; j++) {
ans = Math.min(ans, Math.min(BWcnt(i, j), WBcnt(i, j)));
}
}
System.out.println(ans);
}
static int BWcnt(int r, int c) {
int cnt = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (map[r + i].charAt(c + j) != BW[i].charAt(j))
cnt++;
}
}
return cnt;
}
static int WBcnt(int r, int c) {
int cnt = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (map[r + i].charAt(c + j) != WB[i].charAt(j))
cnt++;
}
}
return cnt;
}
}
4. 마치며
제일 작은 판을 찾으면 된다는 말을 해석하는데 오래걸렸다!
'알고리즘' 카테고리의 다른 글
프로그래머스 : 정수 내림차순으로 배치하기 (Java) (0) | 2021.06.04 |
---|---|
프로그래머스 : 자연수 뒤집어 배열로 만들기 (Java) (0) | 2021.06.04 |
프로그래머스 : 문자열 내림차순으로 배치하기 (Java) (0) | 2021.05.30 |
프로그래머스 : 메뉴 리뉴얼 (Java) (0) | 2021.05.24 |
프로그래머스 : 게임 맵 최단거리 (Java) (0) | 2021.05.22 |