본문 바로가기
Computer/Algorithm_Java

[BaekJoon] 1018번 체스판 다시 칠하기 문제풀이 (Success)

by HJ0216 2023. 8. 14.
 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

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

 

📚 참고 자료

 

[백준] 1018번 : 체스판 다시 칠하기 - JAVA [자바]

www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어

st-lab.tistory.com