☕Language: Java
🚨 3일을 고민해도 풀 수 없어 풀이를 열심히 찾아봄
😮 찾아본 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static boolean[][] arr;
public static int min = 64;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int ROW = Integer.parseInt(st.nextToken());
int COL = Integer.parseInt(st.nextToken());
arr = new boolean[ROW][COL];
for (int i = 0; i < ROW; i++) {
String s = br.readLine();
for (int j = 0; j < COL; j++) {
if (s.charAt(j) == 'W') {
arr[i][j] = true;
}
}
}
for (int i = 0; i < ROW - 7; i++) {
for (int j = 0; j < COL - 7; j++) {
check(i, j);
}
}
bw.write(min + "");
bw.flush();
bw.close();
}
public static void check(int x, int y) {
int cnt = 0;
boolean value = arr[x][y];
for (int i = x; i < x + 8; i++) {
for (int j = y; j < y + 8; j++) {
if (arr[i][j] != value) {
cnt++;
}
value = (!value);
}
value = (!value);
}
cnt = Math.min(cnt, 64 - cnt);
min = Math.min(min, cnt);
}
}
|
1. boolean[][] arr
- boolean 타입 이중 배열을 전역으로 설정하여, main()과 check()에서 공유하여 사용
2. arr = new boolean[ROW][COL]
- 입력된 행렬의 크기에 맞춰 이중 배열 선언
3. if (s.charAt(j) == 'W') {arr[i][j] = true;}
- 'W'일 경우, true 입력
- boolean 배열의 기본값은 false이므로 B일 경우 false 처리는 생략
4. check()
- 행렬의 범위를 i < x + 8, j < y + 8로 설정하여 반복문 실행: 0~7, 1~8, 2~9, ... 탐색
- 체스판 크기 8 * 8에 맞춰 check() 호출
5. boolean value = arr[x][y]
- 체스판의 시작값을 기준값으로 설정하는 변수 value 선언
6. if (arr[i][j] != value) {cnt++;}
- 체스판과 다른 패턴일 경우, cnt 변수 1 증가
7. value = (!value)
- 바둑판 무늬이므로 1번 사용 시마다 TF 변경
- 행이 변경될 경우, TF가 변경되므로 inner for문이 종료될 경우도 TF 변환
8. cnt = Math.min(cnt, 64 - cnt)
- 체스판 시작(arr[x][y])이 B인 경우에는 W기준으로, W인 경우에는 B를 기준으로 변경을 가장 적게하는 방법 탐색
9. int min = 64
- int 타입 변수 min을 전역으로 설정하여, main()과 check()에서 공유하여 사용
10. min = Math.min(min, cnt)
- 체스판 크기인 8*8에 맞춰 0~7, 1~8, ...을 탐색하므로 check() 호출 시마다 가장 변경이 적은 min값 갱신
🔗 소스 코드
HJ0216/TIL/BOJ
📚 참고 자료
'Computer > Algorithm_Java' 카테고리의 다른 글
[BaekJoon] 10814번 나이순 정렬 문제풀이 (Success) (0) | 2023.08.16 |
---|---|
[BaekJoon] 1181번 단어 정렬 문제풀이 (Success) (0) | 2023.08.15 |
[BaekJoon] 10816번 숫자 카드 2 문제풀이 (Success) (0) | 2023.08.13 |
[BaekJoon] 7785번 회사에 있는 사람 문제풀이 (Success) (0) | 2023.08.12 |
[BaekJoon] 14425번 문자열 집합 문제풀이 (Success) (0) | 2023.08.11 |