728x90
반응형
반응형
728x90
문제 링크
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static char[][] board;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// 보드판 생성
board = new char[n][m];
// 입력받은 값으로 보드판 만들기
for (int i = 0; i < n; i++) {
String str = br.readLine();
for (int j = 0; j < m; j++) {
board[i][j] = str.charAt(j);
}
}
// 칠해야 하는 정사각형의 개수는 최대 64개
int min = 64;
// 8 x 8 크기의 정사각형으로 보드판 순회
for (int i = 0; i <= n - 8; i++) {
for (int j = 0; j <= m - 8; j++) {
min = Math.min(min, findMin(i, j));
}
}
System.out.println(min);
br.close();
}
public static int findMin(int i, int j) {
int white = 0; // 왼쪽 맨 위 칸이 하얀색으로 시작하는 경우 -> 짝수 칸이 하얀색
int black = 0; // 왼쪽 맨 위 칸이 검은색으로 시작하는 경우 -> 짝수 칸이 검은색
// i, j부터 8칸만큼의 정사각형만큼 순회
for (int a = 0; a < 8; a++) {
for (int b = 0; b < 8; b++) {
// 현재 위치를 표시
if ((a + b) % 2 == 0) {
if (board[a + i][b + j] == 'W') { // 현재 위치가 하얀색
black++;
} else { // 현재 위치가 검은색
white++;
}
} else {
if (board[a + i][b + j] == 'W') {
white++;
} else {
black++;
}
}
}
}
return Math.min(white, black);
}
}
풀이
1. 입력값에는 띄어쓰기가 없다
- 자주 쓰던 StringTokenizer을 쓰지 못한다
- 한 문장을 읽은 뒤 charAt()을 사용해 문자로 변환하여 배열에 삽입한다
2. 행과 열의 마지막은 n - 1, m - 1
- 8 x 8 크기의 정사각형으로 입력받는 배열을 순회해야 한다
- 인덱스는 0 ~ 7이므로 배열의 범위를 <= n - 8로 설정해야 한다
- 배열을 순회하는 인덱스는 0 ~ n - 8 + 7 = n - 1 이므로 전체 인덱스를 모두 순회한다 (n개)
3. 검은색과 흰색으로 시작하는 두 가지 경우가 있다
- white는 흰색, black은 검은색으로 시작하는 경우
- 흰색으로 시작한다면 짝수 칸에는 흰색, 홀수 칸에는 검은색이 칠해져 있어야 한다
- 짝수 칸에 검은색이 칠해져 있다면 white를 1 증가시킨다
- 홀수 칸에 흰색이 칠해져 있다면 white를 1 증가시킨다
- 두 가지 경우를 고려했을 때, white와 black 중 더 작은 값을 반환한다
4. 8 x 8 정사각형이 순회하면서 최솟값을 얻는다
- 최솟값을 반환받을 때마다 더 작은 값을 저장한다
주석을 써야겠다. 단계가 높아질 수록 코드가 길어지고, 모든 정보가 머리 속에 저장되지 않는다
728x90
반응형
'Problem Solving > Baekjoon' 카테고리의 다른 글
| [Baekjoon] 2751. 수 정렬하기 2 - ArrayList, Timsort (0) | 2024.10.09 |
|---|---|
| [Baekjoon] 1436. 영화감독 숌 / contains() (1) | 2024.10.08 |
| [Baekjoon] 2745. 진법 변환 & 11005. 진법 변환 2 / parseInt(), toString() (0) | 2024.09.29 |
| [Baekjoon] 10798. 세로 읽기 / char[] 배열의 초기값, for-each문 쓰기 (0) | 2024.09.22 |
| [Baekjoon] 25206. 너의 평점은 / Double.parseDouble() (0) | 2024.09.21 |